将现有列更改为“主键”'并且' NOT NULL'没有丢桌子

时间:2018-04-06 13:17:09

标签: sql-server

我有一个名为dbo.ReferenceDetails的表,其中包含数百万条记录。这是我的表的创建和选择脚本:

CREATE TABLE [dbo].[RefDetails](
      [REQ_XREF_TYPE] [varchar](12) NULL
    , [REQUEST_ID] [varchar](24) NULL
    , [CROSS_REFERENCE] [varchar](32) NULL
    , [RUN_BY] [varchar](100) NULL
    , [RUN_DATE] [datetime] NULL
    , [ISCURRENTRECORD] [int] NULL
    , [RECORDSTARTDATE] [datetime2](7) NULL
    , [RECORDENDDATE] [datetime2](7) NULL
    , [UPDATE_FLAG] [varchar](50) NULL
    , [SECUREFLAG] [int] NULL
    , [EVENT_TIMESTAMP] [datetime2](7) NULL 
    ) ON [PRIMARY]

SELECT TOP (10) 
   [REQ_XREF_TYPE]
  ,[REQUEST_ID]
  ,[CROSS_REFERENCE]
  ,[RUN_BY]
  ,[RUN_DATE]
  ,[ISCURRENTRECORD]
  ,[RECORDSTARTDATE]
  ,[RECORDENDDATE]
  ,[UPDATE_FLAG]
  ,[SECUREFLAG]
  ,[EVENT_TIMESTAMP]
FROM [dbo].[ReferenceDetails]

我是否可以更改表格,以便REQ_XREF_TYPEISCURRENTRECORDEVENT_TIMESTAMP为主键,NOT NULL而不删除表格?

您的回复将不胜感激。 :)

1 个答案:

答案 0 :(得分:0)

见下文。首先需要将列转换为NOT NULL,然后创建主键。如果表中已有数据,则创建主键可能需要一些时间。

ALTER TABLE [dbo].[RefDetails] ALTER COLUMN [REQ_XREF_TYPE] VARCHAR(12) NOT NULL
ALTER TABLE [dbo].[RefDetails] ALTER COLUMN [ISCURRENTRECORD] INT NOT NULL
ALTER TABLE [dbo].[RefDetails] ALTER COLUMN [EVENT_TIMESTAMP] DATETIME2(7) NOT NULL
ALTER TABLE [dbo].[RefDetails] ADD CONSTRAINT PK_RefDetails PRIMARY KEY ([REQ_XREF_TYPE],[ISCURRENTRECORD],[EVENT_TIMESTAMP]);

注意:您的创建脚本表示表名是RefDetails,但您的OP表示ReferenceDetails。我选择了创建脚本名称。

<强>更新

主键要求所选的任何列都包含唯一的组合 - 不允许重复。如果存在重复项,则主键的创建将失败。要在创建主键之前检查重复项,请运行以下命令:

SELECT [REQ_XREF_TYPE], [ISCURRENTRECORD], [EVENT_TIMESTAMP], CountDupes = COUNT(1)
FROM [dbo].[RefDetails]
GROUP BY [REQ_XREF_TYPE], [ISCURRENTRECORD], [EVENT_TIMESTAMP]
HAVING COUNT(1) > 1
ORDER BY [REQ_XREF_TYPE], [ISCURRENTRECORD], [EVENT_TIMESTAMP]

您期望0结果,这意味着没有重复。任何结果都将标识唯一的重复记录集以及它们重复的次数(请参阅CountDupes列结果)。

如果您得到0结果,那么您很清楚创建主键。

如果您得到任何结果,则需要解决此问题(即删除重复项或包含创建唯一组合的其他列)。