06.08.2009

Триггеры SQLite и целостность данных

Для одной своей затеи использую базу данных sqlite3. Нужно мне было добавлять новые записи в Таблицу 3, основываясь на информации из Таблицы 1 и Таблицы 2 (оттуда и оттуда надо было выбирать значения некоторых столбцов и копировать их в новую запись Таблицы 3). Проблема - данные в Таблице 3 должны быть уникальны, но критерием уникальности служит содержимое не одного столбца, а двух сразу. Собственно говоря, контроль за целстностью данных, применяемый на данный момент в стандарте SQL, без проблем позволяет задавать совокупность содержимого нескольких столбцов в кач-ве уникального ключа (и не только это конечно, в SQL для подобной задачи решений может быть несколько). В SQLite я подобной возможности не нашел. Помогли триггеры. Привожу ниже их код, может еще кому пригодится:
# Добавление записей для нового id1 в таблицу 3 при добавлении 
# нового id1 в таблицу 1
CREATE TRIGGER add_new_id1 AFTER INSERT ON table1 FOR EACH ROW
BEGIN
 INSERT INTO table3 (id2,id1) SELECT id2, id1 FROM table2, table1
   WHERE id1 = NEW.id1;
END

# Добавление записей для нового id2 в таблицу 3 при добавлении
# нового id2 в таблицу 2
CREATE TRIGGER add_new_id2 AFTER INSERT ON table2 FOR EACH ROW
BEGIN
 INSERT INTO table3 (id2,id1) SELECT id2, id1 FROM table2, table1
   WHERE id2 = NEW.id2;
END
Таким образом, при каждом добавлении новой записи в таблицу 1 или таблицу 2, в таблице 3 появляется "массив" с уникальными значениями пар id1 - id2 (т.е. для каждого id2 создается комбинация id2 => id1, где id1 изменяется от 1 до N).

Ссылки по теме:



0 коммент.:

Отправить комментарий

Спасибо за комментарий!