SQL插入冲突主键
我有一个主键由三列组成的表:SQL插入冲突主键,sql,primary-key,Sql,Primary Key,我有一个主键由三列组成的表:code\u TARIF、UNITE、MODE\u LIV。在我的表格中,有三条记录的模式为MODE_LIV=2。然后我插入了一条模式为4的记录 INSERT INTO T_TARIF ( CODE_TARIF, ZONE, UNITE, MODE_LIV, LIBELLE, TR_DEBUT, TR_FIN, MONTANT ) SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90' U
code\u TARIF、UNITE、MODE\u LIV
。在我的表格中,有三条记录的模式为MODE_LIV=2
。然后我插入了一条模式为4的记录
INSERT INTO T_TARIF (
CODE_TARIF, ZONE, UNITE, MODE_LIV, LIBELLE, TR_DEBUT, TR_FIN, MONTANT
)
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90'
UNION ALL
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90'
UNION ALL
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90'
它返回一个错误(违反主键),这没有任何意义,因为MODE_LIV=2
不等于MODE_LIV=4
INSERT INTO T_TARIF (
CODE_TARIF, ZONE, UNITE, MODE_LIV, LIBELLE, TR_DEBUT, TR_FIN, MONTANT
)
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90'
UNION ALL
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90'
UNION ALL
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90'
我知道我可以添加一个代理项作为自动递增的标识列,但在我的情况下,这不是一个选项。您正在主键字段中插入3行数据相同的数据。
当然你会被PK违规 将代码更改为:
INSERT INTO T_TARIF (CODE_TARIF, ZONE, UNITE, MODE_LIV, LIBELLE, TR_DEBUT, TR_FIN, MONTANT)
SELECT 'Livr_A_50_99', '2', '1', '3', 'sdg', '50', '99', '90'
UNION ALL
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90'
UNION ALL
SELECT 'Livr_A_50_99', '2', '1', '5', 'sdg', '50', '99', '90'
//Different data for every row ^
观察您的查询,我看到您试图在一个表中插入的三条完全相同的记录有一个主键(这是违反的,因为构建PK的三个字段是相同的
'Livr\u a\u 50\u 99','1','4'
) 我猜“三个主键”是指复合键。在你的情况下,你的主键不能有重复的数据,code\u-TARIF
、UNITE
和MODE\u-LIV
的组合是三个重复的记录。如果我正确阅读你的帖子,你有一个由(code\u-TARIF、UNITE和MODE\u-LIV)组成的复合主键
在这种情况下,您的insert尝试插入带有PK的所有3行
'Livr_A_50_99','1', '4'
如果您不打算插入完全相同的数据3次,则将您的UNION ALL
替换为UNION
,这将只插入一次行
如果您打算使用代理自动递增PK,则需要将表DDL更改为
CREATE TABLE T_TARIF
(
T_TARIF_Id INT identity(1,1) NOT NULL,
... Other fields here
)
GO
ALTER TABLE T_TARIF ADD CONSTRAINT PK_Tariff PRIMARY KEY(T_TARIF_Id)
GO
主键用于标识一行数据 在您的示例中,插入了3行相同的数据。这意味着主键将标识所有三行,而不仅仅是一行。根据定义,这是一个主键冲突 您的选择是:
-添加新字段(如自动递增id)以区分行
-仅插入一个重复行
-修改数据,使其只需要插入一次(例如添加“计数”字段)
-修改数据,使主键字段与任何其他行不相同您要为所有主键列插入3行值相同的行。(事实上,所有非PK列)