1
Table A
(
Table_A_ID int
)

Table B
(
Table_B_ID int
Value int
)

假设我想将数据插入表 B,其中“值”与 Table_A_ID 相同。我将如何进行约束或检查插入时表中是否确实存在数据?

4

4 回答 4

1

您可能不仅需要在 INSERT 到表 B 中强制执行数据完整性,还需要在两个表中的 UPDATE 和 DELETE 上强制执行数据完整性。

无论如何选择是:

  1. 表 B 上的外键约束
  2. 两个表上的TRIGGER
  3. 作为最后的手段,如果出于某种原因 1 和 2 不是所有插入的选项STORED PROCEDURE,删除两个表的更新操作

大多数情况下首选的方法是外键约束。

于 2013-02-10T03:37:55.390 回答
0

是的,我同意@peterm。

原因,如果您的两者Table_A_IDTable_B_Id都是两个表的主键,那么您甚至不需要两个表来存储value. 因为,你的两张桌子似乎是“一对一”的关系。这是数据库完整性问题之一。

我认为您没有对此数据库进行适当的规范化。
只是建议一个好主意!

于 2013-02-10T03:55:09.340 回答
0
于 2013-02-10T04:05:09.867 回答
0

在表 B 上引用“Table_A_ID”列的“值”列上创建外键约束。

这样做只会允许将表 A 中存在的值添加到表 B 的“值”字段中。

为此,您首先需要使 Table_A_ID 列成为表 A 的主键,或者至少必须对其应用某种唯一约束才能成为外键候选者。

BEGIN TRANSACTION -- REMOVE TRANSACTION AND ROLLBACK AFTER DONE TESTING    

--PUT A PRIMARY KEY ON TABLE A
CREATE TABLE A 
( Table_A_ID int CONSTRAINT PK_A_Table_A_ID PRIMARY KEY)

--ON VALUE ADD A FOREIGN KEY CONSTRAINT THAT REFERENCEs TABLE A
CREATE TABLE B
( Table_B_ID int,
  [Value] int CONSTRAINT FK_B_Value_A REFERENCES A(Table_A_ID)
)

-- TEST VALID INSERT
INSERT A (Table_A_ID) VALUES (1)
INSERT B (Table_B_ID, [Value]) VALUES (1,1)

--NOT ALLOW TO INSERT A VALUE THAT DOES NOT EXIST IN A
--THIS WILL THROW A FOREIGN KEY CONSTRAINT ERROR
INSERT B (Table_B_ID, [Value]) VALUES (1,2) -- 2 DNE in table A

ROLLBACK

注意:'FK_B_Value_A' 或 'PK_A_Table_A_ID' 没有什么魔力,它只是一个命名约定,可以被称为任何东西。外键和主键行的语法如下:

column-definition CONSTRAINT give-the-constraint-a-name REFERENCES table-name ( table-column )

column-definition CONSTRAINT give-the-constraint-a-name PRIMARY KEY

于 2018-11-06T09:13:26.177 回答