使用另一张表中的数据设置默认值

4
在创建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表中已经填充了提供Test_2表中B2可能值的记录。例如,这些可能是一些常量,如“Created”,“In Progress”,“Paused”,“Finished”用于“Status”列(即B2)。
当然,我可以选择从Test_1中选择一个值的主键,并将其硬编码为B2的默认值,但如果稍后更改Test_1的数据,则容易出错。同时,我们不能在CREATE语句中使用SELECT语句。
如果SQLite中不可行,其他SQL引擎是否可以实现?或者更一般地说,这是否应该由应用程序逻辑而不是数据库设计来强制执行?

1
我认为你对外键有一些混淆的期望。当你向 Test_1 插入一条记录时,并不会自动创建 Test_2 中的新记录。你可以向 Test_1 插入几条记录。当插入记录到 Test_2 时,你想从 A1 中选择哪个值?外键并不意味着一对一的关系。 - cha
@cha,感谢您的评论。我假设Test_1中的记录已经存在,例如它们可能是Test_2表中某个列/字段的一些常量。我只想使用在Test_1中定义的其中一个常量作为Test_2表中相应列的默认值。 - MLister
@cha,请看上面的编辑,我给出了一个例子来澄清上下文。 - MLister
1个回答

3
我认为你可以使用 TRIGGER
在INSERT时,你可以测试B2的值,如果它没有被填充,那么你可以选择Test_1中列A1的一个值并填充该列。
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

触发器的性能如何?使用它会对数据库的性能产生任何影响吗? - MLister
我认为如果你不过度使用它们,它们应该是可以的。在sqlite中,触发器特别快,因为允许的唯一语句是update/insert/delete/select之一。你真的不能在那里放很多代码。所以,你不会明显地拖慢你的系统。 - cha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接