Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用其他表中的数据设置默认值_Sql_Sqlite - Fatal编程技术网

Sql 使用其他表中的数据设置默认值

Sql 使用其他表中的数据设置默认值,sql,sqlite,Sql,Sqlite,在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提供可

在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
提供可能值的记录。例如,对于“状态”列(即
B2
),这些可能是一些常量,如“已创建”、“正在进行”、“已暂停”、“已完成”)

当然,我可以从
Test_1
中选择一个值的主键,并将其硬编码为
B2
的默认值,但如果我稍后更改
Test_1
的数据,则很容易出错。同时,我们不能在
CREATE
中使用
SELECT
语句

如果这在SQLite中不可行,那么对于其他SQL引擎是否可行?或者更一般地说,这应该由应用程序逻辑而不是数据库设计来实现吗?

我认为您可以使用

您可以在插入时测试
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

我想你对外键有一个模糊的期望。当您将记录插入测试_1时,测试_2中的新记录不会自动创建。您可以在测试_1中插入一些记录。当需要将记录插入测试_2中时,您希望从A1中选择什么值?外键并不意味着一对一relationship@cha,谢谢你的评论。我假设
Test_1
中的记录已经存在,例如,它们可能是
Test_2
中某个列/字段的一些常量。我只想使用
Test_1
中定义的一个常量作为
Test_2
表中相应列的默认值。@cha,请参见上面的编辑,我在这里举了一个例子来说明上下文。触发器的性能如何?使用它会影响数据库的性能吗?我认为如果你不过度使用它们,它们应该是好的。在sqlite中,触发器的速度特别快,因为唯一允许的语句是update/insert/delete/select。你不能在那里放太多的代码。因此,您将无法显著降低系统的速度