【问题标题】:insert into foreign key proper sql execution插入外键正确的sql执行
【发布时间】:2014-05-02 11:34:02
【问题描述】:

我发现我的 PK 导致的错误没有值,因此我在 FK 上的插入失败。

如表A的uId是表B的uId(FK)的PK,所以如果我想在表B的uId中插入1,那么表A的uId必须为1。

但是那是 2 次查询执行吗?应该怎么写?我第二次尝试了 2 sql 执行 - 插入 FK 的地方失败了。

【问题讨论】:

  • 你能说得更具体点吗?通常,如果您不知道外键 ID(例如,如果 FK 是代理键),您将能够基于另一个(例如自然)键来查找它。另外,请记住 FK 可以为 NULLABLE,即如果 A 和 B 之间的关系是可选的。
  • @StuartLC 这种关系是存在的,我不明白你为什么说 A 和 B 是可选的。我的问题是我无法插入 FK。我将 2 个查询放在一个文件中。第二个失败,因为它似乎无法识别第一个,我在表 A 的 PK 中插入了一个值。
  • 表 A 的 PK 是否有可能是 IDENTITY,即您是否需要找到最近插入的 A ID 的 ID,以便可以将其用于插入 B?如果没有,您必须在插入 A 时提供 A 的 PK,因此您应该知道 A ID。
  • oic。所以我不应该使用相同的变量插入?相反,我应该选择插入的 PK。例如像这样“插入 tableA(uId) values("select uId from tableA")??

标签: php mysql sql sql-server database


【解决方案1】:

我已将 cmets 中讨论的 3 种方法放入 SqlFiddle here

-- Null Foreign Key, if the relationship is optional
INSERT INTO B(AID) VALUES(NULL);

-- Lookup - if you know of another `natural` column in table A, 
-- e.g. here we know the Name we need to link to
INSERT INTO B(AID) VALUES((SELECT AID FROM A WHERE AName = 'Foo'))

-- Identity Insert - when A and B are inserted at the same time, 
-- and you need to pass A ID to B
INSERT INTO A(AName) VALUES('Baz');
INSERT INTO B(AID) VALUES((SELECT SCOPE_IDENTITY()));

SELECT * FROM A;
SELECT * FROM B;

MySql 也差不多,用LAST_INSERT_ID() vs SCOPE_IDENTITY()

【讨论】:

  • $stmt2 = $db->prepare("INSERT INTO usertabbrige(tabId,uId) VALUES ((LAST_INSERT_ID()),$userId)");有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多