我有一个名为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_TYPE
,ISCURRENTRECORD
和EVENT_TIMESTAMP
为主键,NOT NULL
而不删除表格?
您的回复将不胜感激。 :)
答案 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结果,那么您很清楚创建主键。
如果您得到任何结果,则需要解决此问题(即删除重复项或包含创建唯一组合的其他列)。