2015-04-28 3 views
2

При создании таблицы в SQLite я хочу определить значение по умолчанию для столбца, используя значение из другой таблицы (поскольку этот столбец является внешним ключом). Что-то вроде этого:Установка значения по умолчанию с использованием данных из другой таблицы

CREATE TABLE Test_1(A1 INTEGER PRIMARY KEY, B1 TEXT NOT NULL); 
CREATE TABLE Test_2(A2 INTEGER PRIMARY KEY, B2 INTEGER NOT NULL DEFAULT [a value in column A1 of Test_1]); 

Я предполагаю, что Test_1 уже заполнена записями, что обеспечивает возможные значения B2 в Test_2 таблице. Например, это могут быть некоторые константы, такие как «Создано», «Выполняется», «Приостановлено», «Готово» для столбца «Статус» (то есть B2).

Я могу, конечно, выбрать первичный ключ значения от Test_1 и жесткий код его в качестве значения по умолчанию для B2, но это чревато ошибками, если я изменю данные Test_1 позже. В то же время мы не можем использовать оператор SELECT внутри CREATE.

Если это невозможно в SQLite, возможно ли это для других механизмов SQL? Или, в более общем плане, это что-то, что должно выполняться логикой приложения, а не дизайном базы данных?

+1

Я думаю, что у вас есть смутное ожидание внешних ключей. Когда вы вставляете запись в Test_1, новая запись в Test_2 НЕ создается автоматически. Вы можете вставить несколько записей в Test_1. Когда пришло время вставить записи в Test_2 какое значение вам нужно выбрать из A1? Внешний ключ не означает отношения «один-к-одному» – cha

+0

@cha, спасибо за комментарий. Я предполагаю, что записи в 'Test_1' уже существуют, например. они могут быть некоторыми константами для определенного столбца/поля в 'Test_2'. Я просто хочу использовать одну из констант, определенных в «Test_1», в качестве значения по умолчанию для соответствующего столбца в таблице «Test_2». – MLister

+0

@cha, см. Править выше, где я приведу пример, чтобы прояснить контекст. – MLister

ответ

1

Я думаю, что вы можете использовать TRIGGER

Вы можете проверить для значения B2 на INSERT, и если он не заполнен, то вы можете выбрать значение в столбце A1 из Test_1 и заполнения столбца:

CREATE TRIGGER IF NOT EXISTS Test_2_B2_value 
AFTER INSERT ON Test_2 
FOR EACH ROW WHEN Test_2.B2 IS NULL 
BEGIN 
NEW.B2 = (SELECT A1 FROM Test_1 LIMIT 1); 
END 
+0

Как работает триггеры? Использует ли это влияние на производительность базы данных? – MLister

+0

Я думаю, что если вы не переусердствуете с ними, все должно быть в порядке. В sqlite триггеры особенно быстры, поскольку единственный оператор, который разрешен, есть одно из update/insert/delete/select. Вы не можете поместить там много кода. Таким образом, вы не сможете значительно замедлить работу системы – cha

Смежные вопросы