0

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

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

INSERT INTO TableA VALUES(1111, 'val1a', 'val2a', 'val3a', 'val4a', 'val5a')

下一个插入具有相同的值但不同的 ColumnCode:

INSERT INTO TableA VALUES(1234, 'val1a', 'val2a', 'val3a', 'val4a', 'val5a')

问题是我想防止这样的插入,在这种情况下,我可能会遇到仅为另一个 ColumnCode 插入相同值的情况。

任何的想法?

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

INSERT INTO TableA VALUES(1456, 'val1a', 'val2a', 'val3a', 'val32a', 'val654a')

如图所示,set(ColumnA2, ColumnA3, ColumnA4, ColumnA5) 的值不是重复的。ColumnA4 和 ColumnA5 的值不同。所以,对我来说,只有当所有四个 ColumnA 值都在任何 ColumnCode 下的表中时,才会出现重复。

希望我澄清了我的问题?

4

8 回答 8

2

您可能想看看 using SQL UNIQUE Con​​straint

UNIQUE 约束唯一标识数据库表中的每条记录。

UNIQUE 和 PRIMARY KEY 约束都为一列或一组列提供唯一性保证。

PRIMARY KEY 约束自动定义了一个 UNIQUE 约束。

请注意,每个表可以有许多 UNIQUE 约束,但每个表只能有一个 PRIMARY KEY 约束。

看看下面的例子......

SQL 小提琴演示

CREATE TABLE TABLE1(
  col1 varchar(50) PRIMARY KEY,
  col2 varchar(50),
  col3 varchar(50),
  col4 varchar(50),
  CONSTRAINT uc UNIQUE (col2,col3,col4)
 );

这应该工作:

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');
于 2012-10-10T06:33:03.183 回答
0

您应该能够添加多列唯一约束。就像是:

alter table TableA add CONSTRAINT UNIQUE(ColumnA2, ColumnA3, ColumnA4, ColumnA5)
于 2012-10-10T06:34:55.977 回答
0

ColumnCode 是 PK,因此它是唯一的;您接受此列的唯一值,

所有列ColumnA1-5都不是唯一列,这就是它接受所有重复值的原因,如果您想避免 create unique key 在 tht 列的任何列中出现重复条目​​。

alter table tableA add unique index(ColumnA2, ColumnA3, ColumnA4, ColumnA5);

这将解决你的问题

于 2012-10-10T06:36:40.500 回答
0

您可以在数据库中使用触发器

触发器是代码,它可以在查询之后运行一些代码,也可以代替查询。您可以在此处查看一些示例。

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

于 2012-10-10T06:38:12.207 回答
0

更改表 TableA 添加约束唯一(ColumnA2,ColumnA3,ColumnA4,ColumnA5)

于 2012-10-10T06:45:26.130 回答
0

请删除所有唯一键

alter table TableA  drop unique key;
于 2012-10-10T06:49:20.090 回答
0

您可以使用所有需要唯一的列中的一个校验和列。并更新所有插入和更新。在更新和插入任何新行之前检查是否存在 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 http://www.bluegecko.net/mysql/using-checksums-to-ensure-table-consistency-in-mysql/

于 2012-10-10T07:02:17.460 回答
0
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
    )

在测试表上创建一个插入和更新触发器以查找列(C1,C2,C3,c4,c5)的校验和并插入到 ChecksumColumnCRC32(C1,C2,C3,c4,c5)用于获取校验和

在插入和更新之前,请检查以下条件 Select top 1 from test where ChecksumColumn =CRC32(C1,C2,C3,c4,c5)

如果存在 - 重复记录,否则继续更新 ChecksumColumnCRC32(C1,C2,C3,c4,c5)

于 2012-10-10T10:31:09.407 回答