如何在主键列中插入重复值?

时间:2016-04-05 14:26:26

标签: sql sql-server

我有一个在第一列上有主键的表,但是当我看到该表的可用数据时,我发现重复的记录包括主键数据。我想知道它怎么可能?主列是否在SQL Server 2008中重复了数据?

enter image description here

        SET ANSI_NULLS ON
        GO

        SET QUOTED_IDENTIFIER ON
        GO

        SET ANSI_PADDING ON
        GO

        CREATE TABLE [dbo].[DemoTbl](
            [ProcedureId] [int] NOT NULL,
            [ProcedureName] [nvarchar](100) NOT NULL,
            [VersionNo] [char](5) NULL,
            [PublishDate] [datetime] NULL,
            [PublishUser] [varchar](50) NULL,

            [SpecialtyId] [int] NOT NULL,
            [ProcedureNumber] [varchar](20) NULL,
            [PowerpointName] [nvarchar](100) NULL,
            [Duration] [int] NOT NULL,

            [LanguageId] [int] NOT NULL,

            [TierId] [smallint] NOT NULL,
            [PrintPdf] [bit] NULL,
            [PresentationModeId] [tinyint] NULL,
         CONSTRAINT [pk_DemoTbl] PRIMARY KEY CLUSTERED 
        (
            [ProcedureId] ASC,
            [LanguageId] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]

        GO

        SET ANSI_PADDING OFF
        GO

        ALTER TABLE [dbo].[DemoTbl]  WITH CHECK ADD FOREIGN KEY([PresentationModeId])
        REFERENCES [dbo].[DemoTbl] ([PresentationModeId])
        GO

        ALTER TABLE [dbo].[DemoTbl]  WITH CHECK ADD  CONSTRAINT [FK_DemoTbl_Specialty] FOREIGN KEY([SpecialtyId])
        REFERENCES [dbo].[Specialty] ([SpecialtyId])
        GO

        ALTER TABLE [dbo].[DemoTbl] CHECK CONSTRAINT [FK_DemoTbl_Specialty]
        GO

        ALTER TABLE [dbo].[DemoTbl]  WITH CHECK ADD  CONSTRAINT [FK_DemoTbl_TierMaster] FOREIGN KEY([TierId])
        REFERENCES [dbo].[TierMaster] ([TierId])
        GO

        ALTER TABLE [dbo].[DemoTbl] CHECK CONSTRAINT [FK_DemoTbl_TierMaster]
        GO

        ALTER TABLE [dbo].[DemoTbl] ADD  CONSTRAINT [DF_DemoTbl_CreationDate]  DEFAULT (getdate()) FOR [CreationDate]
        GO

        ALTER TABLE [dbo].[DemoTbl] ADD  CONSTRAINT [DF_DemoTbl_ModifiedDate]  DEFAULT (getdate()) FOR [ModifiedDate]
        GO

        ALTER TABLE [dbo].[DemoTbl] ADD  CONSTRAINT [DF_DemoTbl_IsActive]  DEFAULT ((1)) FOR [IsActive]
        GO

        ALTER TABLE [dbo].[DemoTbl] ADD  CONSTRAINT [DF_DemoTbl_LanguageId]  DEFAULT ((1)) FOR [LanguageId]
        GO

        ALTER TABLE [dbo].[DemoTbl] ADD  CONSTRAINT [DF_DemoTbl_ManageContent]  DEFAULT ('false') FOR [ManageContent]
        GO

        ALTER TABLE [dbo].[DemoTbl] ADD  CONSTRAINT [DF__Procedure__Print__1B14C01D]  DEFAULT ((1)) FOR [PrintPdf]
        GO

6 个答案:

答案 0 :(得分:7)

不,SQL Server中无法插入主键中具有重复值的记录。

答案 1 :(得分:2)

同一个表中不可能有多个具有相同主键(PK)的行。

如果您正在进行SELECT并且使用相同的PK获得多行可能是因为:

  1. 该表实际上没有PK,可能没有正确创建。您可以通过执行以下操作来检查(它应该返回PK列):

    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name ='TableName'AND COLUMN_KEY ='PRI';

  2. SELECT语句不正确。也许您正在从两个或更多表中进行选择而您没有正确地将它们联系起来。

  3. 澄清一下,您可以执行以下操作:
    1-创建一个新表:

    CREATE TABLE IF NOT EXISTS `Customer` (
       `id` int(4),
       `name` varchar(20),
       `surname` varchar(40),
       `phone` int(9),
       PRIMARY KEY (`id`)
    ) ENGINE=INNODB;
    

    现在您有一个新表来存储由ID标识的客户 2-让我们添加一些客户:

    INSERT INTO Customer VALUES(111, 'John', 'White', 123456789),
        (222, 'Bianca', 'Williams', 987654321),
        (333, 'Mikel', 'Peterson', 421345642),
        (444, 'Jolene', 'Gomez', 948113552);
    

    3-如果您尝试插入具有现有PK(id)的客户,则会收到错误:

    INSERT INTO Customer VALUES (222, 'Paul', 'Brown', 123412345);
    

    4-为了检查决赛桌,您可以进行以下选择:

    SELECT * FROM Customer;
    

答案 2 :(得分:0)

如果primary key constraint已设置为True,则不可能有重复的主键。

为了防止重复的主键,将Identity Specification设置为True

答案 3 :(得分:0)

如果此表是多对多连接中的中间表,则原始列是外键,并且能够接受相同prodId的许多实例(练习的整个点)。如果有人然后在该列上抨击PK,则不能再添加重复项,但如果您查询它,该表仍将返回此人屏幕截图中的原始内容。

这种情况可以在产品和订单之间的Northwind示例数据库中看到(OrderDetails表在OrderID上有复合PK,ProdID但仍然显示两者的重复)。之后,在添加数据后添加了PK。

中间表是多对多表之间的链接,通常不需要PK。规范化101。

答案 4 :(得分:0)

对于PK约束,它会在定义的PK上创建唯一索引(Clustered / non Clustered)。如果我们在加载之前禁用索引包括PK唯一索引,那么我们可以在列中插入重复的PK,因为禁用了PK约束。因此,在禁用索引时,请避免禁用PK索引“is_primary_key = 0以禁用所有其他索引”

答案 5 :(得分:-1)

已测试 -> 如果我们创建一个带有非聚集索引的主键是可能的。如果我们禁用此索引,我们将能够插入重复的记录。但是 - 无法使用主键上的重复值启用(重建)索引