【问题标题】:Can we drop and recreate primary key in SQL Server table @ Production environment? Do we have to down the server for it or we can do it live?我们可以在 SQL Server 表@生产环境中删除并重新创建主键吗?我们是否必须为此关闭服务器,或者我们可以实时进行?
【发布时间】:2015-12-27 23:00:21
【问题描述】:

我们可以在生产环境中的 SQL Server 表中删除并重新创建复合主键吗?我们是否已经为它关闭了服务器,或者我们可以实时进行吗?

因为我们必须向主键添加更多列。如果我们在现场进行,我们必须面对什么问题?

【问题讨论】:

  • 更多关于这个主题的文章。你为什么不能谷歌它
  • 当索引丢失时,这当然会使查询变慢+有人可能会创建违反它的行——这对你来说是不是一个问题,我们无法真正回答,你甚至没有提到桌子有多大。
  • 还没有真正检查 create ... with (drop_existing = on) 的作用,也许这有帮助
  • 表有 500+ 百万条记录

标签: sql sql-server sql-server-2005 sql-server-2008-r2 sql-server-2012


【解决方案1】:

您可以从表中删除主键。如果您没有在其他列上明确提及,这也将删除该表的聚集索引。

要删除主键,请在查询下方运行

-- Drop CHECK CONSTRAINT from the table
     ALTER TABLE /*schema*/./*table*/
        DROP CONSTRAINT /*constraint_name*/
     GO

并在代码下方添加主键

-- Add a new CHECK CONSTRAINT to the table
ALTER TABLE /*schema*/./*table*/
    ADD CONSTRAINT /*contraint_name*/ /*constraint_type*/ (/*constraint_column_name*/ /*logical_expression*/)
GO

【讨论】:

  • 我们可以做到..但我担心它必须在生产环境中完成。那么对其他正在运行的操作有什么影响吗?
  • 我运行了一个快速测试,我打开了一个事务,从表中选择了所有行,然后休眠 10 秒,运行 drop 并创建约束语句,然后再次选择并休眠 10 秒,然后回滚交易。没有阻塞,选择代码不受影响。然后我尝试改用SELECT * FROM ... WITH(XLOCK),而修改脚本在运行之前等待了整整 20 秒(即它们确实被我明确打开的锁所阻止)。注意我没有测试任何写用例。
猜你喜欢
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 2020-03-23
相关资源
最近更新 更多