如何插入带有引用组合键的外键的行

时间:2019-05-25 18:06:43

标签: mysql sql foreign-keys sql-insert composite-primary-key

我有一个带有复合主键的mysql表,以及一个子表,该子表引用了第一个带有外键的子表。

插入子表的一行的正确语法是什么?

insert语句中如何给出组合键的两个部分?

我有这些表;

CREATE TABLE IF NOT EXISTS parent (
    p_id    INT NOT NULL,
    p_org   INT NOT NULL,
    PRIMARY KEY(p_id, p_org),
    p_name  VARCHAR(12))
ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS child (
    c_id    INT NOT NULL PRIMARY KEY,
    c_org   INT NOT NULL,
    c_p_id  INT NOT NULL, FOREIGN KEY(c_p_id, c_org) REFERENCES parent(p_id, p_org),
    c_info  VARCHAR(12))
ENGINE=InnoDB;

在父级中插入两行后;

insert into parent values(100, 1, 'name-1'), (100, 2, 'name-2');

我想在孩子中插入一行。

insert into child values(1000, 2, 100, 'info-for-2');

但是我不知道如何指定组合键。我想指定(100和2)而不是 100 ,这样我的子行只引用父级(100 2)。

使用上面的insert语句,我的查询返回两行而不是一行;

select * from parent join child on c_p_id = p_id;

返回;

p_id    p_org   p_name  c_id    c_org   c_p_id  c_info
100     1       name-1  1000    2       100     info-for-2
100     2       name-2  1000    2       100     info-for-2

但只想获得(100 2)的行。

我实际上必须在联接上指定c_org吗?

3 个答案:

答案 0 :(得分:0)

是的,您必须在连接上指定c_org:

 select * from parent join child on c_p_id = p_id && c_org = p_org;

您的外键是“ c_p_id”和“ c_org”,而不仅仅是“ c_p_id”。您必须在所有外键列上进行联接。

答案 1 :(得分:0)

是的,您需要在join中指定c_org,查询将变成这样:

select * from parent join child on c_p_id = p_id and c_org = p_org;

这可以在fiddle

中看到

您需要执行此操作,因为您有复合外键。

答案 2 :(得分:0)

您应该开始养成在fetch()语句中显式提及目标列的习惯。

然后,如果您使用{p>在INSERT中插入一行

parent

通过在INSERT INTO parent (p_id, p_org) VALUES (2, 100, 'name-2'); 外键的列中使用child的主键元组的确切值,在parent中插入一行引用parent中的行像元组

childs

要连接行,您需要检查主键中的所有值是否与INSERT INTO child (c_id, c_org, c_p_id, c_info) VALUES (1000, 2, 100, 'info-for-2'); 子句中的外键值匹配。在这里您可以使用ON

AND