【问题标题】:Executing script for add primary keys to all tables returns error执行向所有表添加主键的脚本返回错误
【发布时间】:2019-04-23 07:35:16
【问题描述】:

我想将主键 IDD 添加到架构中的每个 'Temp...' 表中。我正在尝试通过以下方式进行操作:

DECLARE @addId VARCHAR(MAX) = '';
SELECT @addId = @addId + 'ALTER TABLE ['+ TABLE_NAME +'] ADD IDD int IDENTITY(1,1);ALTER TABLE ['+TABLE_NAME +'] ADD PRIMARY KEY (IDD);' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'Temp%'
EXEC (@addId );

我收到这样的错误:

Multiple identity columns specified for table 'TempTable'. Only one identity column per table is allowed.

我做错了什么?

编辑:表中尚未定义主键。

【问题讨论】:

  • 好吧...消息说,您的表中已经定义了一个标识列。你检查表定义了吗?
  • 在运行此查询之前,表中没有定义主键。
  • 好的,有。耶稣对不起。
  • 能否提供表 TempTable 的架构?
  • 花了 4 分钟才发现您的脚本有误。 Newsflash - 您遇到的任何错误很可能是由您自己的代码引起的。也停止假设。错误消息没有说明主键 - 它提到了多个标识列。

标签: sql-server tsql dynamic-sql ddl


【解决方案1】:

试试这个

SELECT @addId = @addId + 
ALTER TABLE ['+ TABLE_NAME +'] ADD IDD int PRIMARY KEY IDENTITY(1,1);
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'Temp%'

【讨论】:

  • 这将尝试更改名为'+ TABLE_NAME +' 的表。无论如何,错误是明确的。 OP的声明没有错。该表已经有一个键。
  • 是的,我认为你是对的,但我希望它能让你写得更简短。
【解决方案2】:

使用此查询获取所有没有主键的表:

select * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT IN(SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE  CONSTRAINT_TYPE='PRIMARY KEY')

并相应地修改您的动态查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2015-12-09
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多