检查插入的另一个表中是否存在数据?

时间:2013-02-10 02:14:55

标签: sql constraints

Table A
(
Table_A_ID int
)

Table B
(
Table_B_ID int
Value int
)

假设我想在表B中插入数据,其中'Value'与Table_A_ID相同。 如何在插入表格中制作约束或检查数据是否实际存在?

4 个答案:

答案 0 :(得分:1)

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

无论如何选项都是:

    表二
  1. FOREIGN KEY CONSTRAINT
  2. 两张桌子上的
  3. TRIGGER
  4. 作为最后的手段,如果出于某种原因,1和2不是所有插入的选项STORED PROCEDURE,则删除两个表的更新操作
  5. 在大多数情况下,首选方式是FOREIGN KEY CONSTRAINT。

答案 1 :(得分:0)

是的,我同意@peterm的意见。

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

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

答案 2 :(得分:0)

我找到了this example,它演示了如何设置外键约束。

创建员工表

CREATE TABLE employee (
    id smallint(5) unsigned NOT NULL,
    firstname varchar(30),
    lastname varchar(30),
    birthdate date,
    PRIMARY KEY (id),
    KEY idx_lastname (lastname)
) ENGINE=InnoDB;

创建借来的表

CREATE TABLE borrowed (
    ref int(10) unsigned NOT NULL auto_increment,
    employeeid smallint(5) unsigned NOT NULL,
    book varchar(50),
    PRIMARY KEY (ref)
) ENGINE=InnoDB;

为借用表

添加约束
ALTER TABLE borrowed
ADD CONSTRAINT FK_borrowed
FOREIGN KEY (employeeid) REFERENCES employee(id)
ON UPDATE CASCADE
ON DELETE CASCADE;

注意:这告诉MySQL我们要通过添加名为borrowed table的约束来更改‘FK_borrowed’employeeid column将引用id column中的employee table - 换句话说,员工必须存在才能借书。

最后两行可能是最有趣的。他们声明,如果更新员工ID或删除员工,则应将更改应用于borrowed table

注意:有关详细信息,请参阅上述网址,这只是该文章的摘录!

答案 3 :(得分:0)

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

这样做只会将表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'并不神奇,它只是一个命名约定而被称为任何东西。外键行和主键行的语法如下:

列定义约束给出约束名称参考表名称表列

列定义约束给出约束名称主键