我有一个带有复合主键的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吗?
答案 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