【发布时间】:2017-04-17 02:20:22
【问题描述】:
我正在努力让所有用户都拥有相同的项目,因为我正在对我的应用进行实验并且需要对展平数据进行实验控制。
我在上次尝试中使用了以下 SQL 语句:
insert into has (email,id,qty,price,item_info,image)
select 'b@localhost.com',id,qty,price,item_info,image
from
(
select * from has
where email != 'b@localhost.com'
) as o
where o.id not in
(
select id from has
where email = 'b@localhost.com'
);
这应该将“b@localhost.com”尚未拥有但其他用户拥有的所有项目添加到“b@localhost.com”的库存中。 (“有”表)
但是,我收到以下错误:
该语句已中止,因为它会导致唯一或主键约束或唯一索引中的重复键值
我了解此错误的含义,但我不明白为什么会发生。我的语句插入了该电子邮件尚未包含的所有记录,因此不应有任何重复的 id/email 对。
数据库结构如下图,圆圈是属性,正方形是表格,菱形是关系集。 HAS 表是在 USER_ACCOUNT 和 ITEM 上设置的关系,其中主键分别是 email 和 id。
【问题讨论】:
-
澄清一下,您希望每个用户都拥有与其他用户相同的项目吗?
-
是的,物品由'id'属性表示。
-
我认为我的策略太复杂了,我应该将所有内容复制到临时表中,然后为 4 个用户执行 4 次插入。
-
has中的主键字段是什么? -
HAS 是一个关系集,所以它的主键是它所连接的表的主键。即:USER_ACCOUNT 的“email”和ITEM 的“id”。