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列)