C# 防止在MySQL数据库中插入相同的值

C# 防止在MySQL数据库中插入相同的值,c#,mysql,C#,Mysql,假设我有表TableA(ColumnCode,ColumnA2,ColumnA3,ColumnA4,ColumnA5) 注意:ColumnCode(PrimaryKey)不是自动递增。我要防止的是以下情况: INSERT INTO TableA VALUES(1111, 'val1a', 'val2a', 'val3a', 'val4a', 'val5a') 下一次插入的值相同,但列代码不同: INSERT INTO TableA VALUES(1234, 'val1a', 'val2a',

假设我有表TableA(ColumnCode,ColumnA2,ColumnA3,ColumnA4,ColumnA5)

注意:ColumnCode(PrimaryKey)不是自动递增。我要防止的是以下情况:

INSERT INTO TableA VALUES(1111, 'val1a', 'val2a', 'val3a', 'val4a', 'val5a')
下一次插入的值相同,但列代码不同:

INSERT INTO TableA VALUES(1234, 'val1a', 'val2a', 'val3a', 'val4a', 'val5a')
问题是我想防止像这样的插入,在这种情况下,我可能会为另一个列代码插入相同的值

有什么想法吗

注2:下一次插入不是问题,因为我没有插入所有相同的列值

INSERT INTO TableA VALUES(1456, 'val1a', 'val2a', 'val3a', 'val32a', 'val654a')
如图所示,值集(列A2、列A3、列A4、列A5)不是重复的。第4列和第5列的值不同。所以,对我来说,只有当所有四个ColumnA值都在任何ColumnCode下的表中时,才会出现重复


希望我能澄清一下我的问题

您可能想看看如何使用

唯一约束唯一地标识数据库中的每个记录 桌子

唯一和主键约束都为 一列或一组列的唯一性

主键约束自动定义了唯一约束 在上面

请注意,每个表可以有许多唯一的约束,但只能有一个 每个表的主键约束

看看下面的例子

这应该起作用:

INSERT INTO TABLE1 VALUES('1','1','1','1');
INSERT INTO TABLE1 VALUES('2','1','1','2');
这应该失败:

INSERT INTO TABLE1 VALUES('1','1','1','1');
INSERT INTO TABLE1 VALUES('2','1','1','1');

您应该能够添加多列唯一约束。 比如:

alter table TableA add CONSTRAINT UNIQUE(ColumnA2, ColumnA3, ColumnA4, ColumnA5)

column
ColumnCode
是PK,所以它的onl;y接受此列的唯一值

所有列
ColumnA1-5
都不是唯一的列,这就是它接受所有重复值的原因,如果您想避免任何列中的重复条目
在tht列上创建唯一键

alter table tableA add unique index(ColumnA2, ColumnA3, ColumnA4, ColumnA5);
这将解决您的问题,您可以在数据库中使用

触发器是代码,它可以在查询后运行一些代码,也可以代替查询。 你可以看到一些例子


但正如在另一个答案中提到的,使用
唯一约束更简单。

更改表A添加唯一约束(列A2、列A3、列A4、列A5)

请删除所有唯一键

alter table TableA  drop unique key;

您可以在需要唯一的所有列中使用一个校验和列。并在所有insert和update中更新。在更新和插入任何新行之前,请检查是否存在ckecksum列。。在ms sql中,我会这样做

    CREATE TABLE [dbo].[test]
    (
      [ID] [int] NOT NULL ,
      [Index] [tinyint] NOT NULL ,
      [C0] [real] NOT NULL ,
      [C1] [real] NOT NULL ,
      [C2] [real] NOT NULL ,
      [C3] [real] NOT NULL ,

    )
ON  [PRIMARY]

GO
ALTER test  ADD UQCHECKSUM AS BINARY_CHECKSUM(
[Index],
[C0] ,
[C1] ,
[C2] ,
[C3] ,
[) PERSISTED
Go  
ALTER TABLE test    ADD CONSTRAINT [UNK_UQCHECKSUM] UNIQUE (UQCHECKSUM)
GO
请检查这个mysql

在测试表上创建一个insert和update触发器,以查找列(C1、C2、C3、c4、c5)的校验和,并将其插入ChecksumColumn 使用
CRC32(C1、C2、C3、c4、c5)
获取校验和

在插入和更新之前,请检查以下条件 从测试中选择顶部1,其中ChecksumColumn=
CRC32(C1、C2、C3、c4、c5)

如果存在--重复记录
否则,继续用
CRC32(C1、C2、C3、c4、c5)更新checksum列。

更新了我的问题。你现在的意见?更新了我的问题。你现在的意见?更新了我的问题。你现在的意见?更新了我的问题。你现在怎么看?
    CREATE TABLE [dbo].[test]
    (
      [ID] [int] NOT NULL ,
      [Index] [tinyint] NOT NULL ,
      [C0] [real] NOT NULL ,
      [C1] [real] NOT NULL ,
      [C2] [real] NOT NULL ,
      [C3] [real] NOT NULL ,

    )
ON  [PRIMARY]

GO
ALTER test  ADD UQCHECKSUM AS BINARY_CHECKSUM(
[Index],
[C0] ,
[C1] ,
[C2] ,
[C3] ,
[) PERSISTED
Go  
ALTER TABLE test    ADD CONSTRAINT [UNK_UQCHECKSUM] UNIQUE (UQCHECKSUM)
GO
CREATE TABLE [dbo].[test]
    (
      [ID] [int] NOT NULL ,
      [C1] [varchar] NOT NULL ,
      [C2] [varchar] NOT NULL ,
      [C3] [varchar] NOT NULL ,
      [C4] [varchar] NOT NULL ,
      [C5] [varchar] NOT NULL ,
      [ChecksumColumn] [varchar] NOT NULL //new column
    )