更新具有聚簇键的表中的PK列

时间:2016-03-10 20:25:02

标签: sql sql-server

我有一个包含群集主键的表的数据库。我相信我接受的术语是使用自然键。 SQL数据库的前端被编程为影响我想要修改的3,000个选定值的所有相关外键表的更改。每次更改大约需要13秒。如果可能的话,我需要在更短的时间内完成这项工作。

执行此操作的原因是准备迁移到新的CMMS程序。

我找到了使用ON UPDATE CASCADE的参考,但我不确定是否适用。

在众多参考文献中,我使用了以下内容: https://social.technet.microsoft.com/Forums/sqlserver/it-IT/23294919-3e6a-4146-a70d-66fa155ed1b3/update-primary-key-column-in-sql-server?forum=transactsql

下面列出具有相同名称[EQNUM]列的15个表中的2个表的示例。表A是使用前端首次修改的表。我为每个表遗漏了许多列:

CREATE TABLE A 
(
    [EQNUM] [varchar](30) NOT NULL,
        CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED ([EQNUM] ASC)
)
GO

SET ANSI_PADDING OFF
GO

CREATE TABLE B 
(
    [EQNUM] [varchar](30) NOT NULL,
    [ColA] [varchar](10) NOT NULL,[ColB] [datetime] NOT NULL,
    [ColC] [varchar](30) NOT NULL, [ColD] [varchar](30) NOT NULL,
    [ColE] [varchar](30) NOT NULL, [ColF] [varchar](30) NOT NULL,
    [ColG] [varchar](11) NOT NULL,[ColH] [varchar](10) NOT NULL,
    [ColI] [datetime] NOT NULL,[ColJ] [varchar](15) NOT NULL,
    [ColK] [int] NULL,

    CONSTRAINT [PK_B] 
        PRIMARY KEY CLUSTERED ([EQNUM] ASC, 
                               [ColA] ASC,[ColB] ASC,[ColC] ASC,[ColD] ASC,[ColE] ASC,
                               [ColF] ASC,[ColG] ASC,[ColH] ASC,[ColI] ASC,[ColJ] ASC)
)

4组UPDATE查询中的1组的示例,我相信添加的第一行和最后ALTER TABLE行将允许我影响更新:

ALTER TABLE A NOCHECK CONSTRAINT [PK_EQUIP]

UPDATE A
SET [EQNUM] = REPLACE([EQNUM],'-B','-B0')
WHERE [EQNUM] LIKE '%-A[1-9][0-5][0-9]-%' OR
      [EQNUM] LIKE '%-A[1-9][A-F][0-5][0-9]-%' OR

ALTER TABLE A CHECK CONSTRAINT [PK_EQUIP]

ALTER TABLE A NOCHECK CONSTRAINT [PK_B]

UPDATE B
SET [EQNUM] = REPLACE([EQNUM],'-B','-B0')
WHERE [EQNUM] LIKE '%-A[1-9][0-5][0-9]-%' OR
      [EQNUM] LIKE '%-A[1-9][A-F][0-5][0-9]-%' OR

ALTER TABLE A CHECK CONSTRAINT [PK_B]

是这么简单,还是我错过了什么?还有更好的方法吗?

0 个答案:

没有答案