【问题标题】:Finding a Primary Key Constraint on the fly in SQL Server 2005在 SQL Server 2005 中动态查找主键约束
【发布时间】:2011-07-13 18:31:47
【问题描述】:

我有以下 SQL:

 ALTER TABLE dbo.PS_userVariables DROP CONSTRAINT PK_PS_userVariables;
 ALTER TABLE dbo.PS_userVariables ADD PRIMARY KEY (varnumber, subjectID, userID, datasetID, listid, userVarTitle);

由于我有多个环境,因此 PK_PS_userVariables 约束名称在我的不同数据库上是不同的。如何编写一个获取该名称的脚本,然后将其添加到我的脚本中?

【问题讨论】:

标签: sql sql-server sql-server-2005 primary-key


【解决方案1】:

虽然典型的最佳做法是始终明确命名您的约束,但您可以从目录视图中动态获取它们:

DECLARE @table NVARCHAR(512), @sql NVARCHAR(MAX);

SELECT @table = N'dbo.PS_userVariables';

SELECT @sql = 'ALTER TABLE ' + @table 
    + ' DROP CONSTRAINT ' + name + ';'
    FROM sys.key_constraints
    WHERE [type] = 'PK'
    AND [parent_object_id] = OBJECT_ID(@table);

EXEC sp_executeSQL @sql;

ALTER TABLE dbo.PS_userVariables ADD CONSTRAINT ...

【讨论】:

    【解决方案2】:
    SELECT 
       A.TABLE_NAME, 
       A.CONSTRAINT_NAME, 
       B.COLUMN_NAME
    FROM 
       INFORMATION_SCHEMA.TABLE_CONSTRAINTS A, 
       INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE B
    WHERE 
          CONSTRAINT_TYPE = 'PRIMARY KEY' 
       AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
    ORDER BY 
       A.TABLE_NAME 
    

    参考:Pinal Dave @http://blog.sqlauthority.com/2008/09/06/sql-server-find-primary-key-using-sql-server-management-studio/

    【讨论】:

    • 除非您需要严格遵守并迎合跨平台,否则我会告诫不要使用 INFORMATION_SCHEMA 视图。在这种情况下可能没问题,但在很多情况下,由于没有维护 I_S 视图,因此它们缺少您无论如何都需要转到目录视图的关键信息(例如索引 - INCLUDE 列、过滤器等)。在 INFORMATION_SCHEMA 中找不到)。
    • @Aaron:我同意,但是当我可以摆脱它时,我会更容易更好,并且 Info 模式在这种特殊情况下应该做得很好,并且无论如何都会更好地扩展。跨度>
    • 我更喜欢一致的代码而不是更简单的代码。学习使用 INFORMATION_SCHEMA 的人会在那些异常案例中不包含的信息中挣扎。无论如何,这种“规模”将如何更好?你的意思是你可以复制那个确切的代码并在其他一些 RDBMS 上运行它吗?这不是大多数人所说的“规模”,而是“可移植性”......
    • 不要试图争论语义——简单并不违背一致。一致性很好,但这是信息模式的一个论点,而不是反对它。 sys 视图将随着时间的推移重新定义,使用新版本的服务器,这就是我所说的可扩展的意思——你今天编写的信息模式依赖项在下一个版本中应该仍然可行。另一方面,系统视图依赖项需要仔细检查。无论如何,你的方式行得通,我的方式行得通,我认为他们都很好知道,但不一定比另一个更好 - 只是取决于手头的工作。
    • 不确定在只处理 SQL Server 的情况下 FOR INFORMATION_SCHEMA 的参数有多一致(大多数人不会全天跳转到不同的 RDBMS 平台,大多数公司也不会迁移一夜之间到不同的平台)。我所说的一致性是使用 INFORMATION_SCHEMA 作为主键,而使用 sys.indexes 等作为索引。
    【解决方案3】:
    DECLARE @TableName varchar(128)
    DECLARE @IndexName varchar(128)
    DECLARE @Command varchar(1000)
    
    SET @TableName = 'PS_userVariables'
    
    SELECT @IndexName = si.name
    FROM sys.tables st
    JOIN sys.indexes si ON st.object_id = si.object_id
    WHERE st.name = @TableName
      AND si.is_primary_key = 1
    
    SET @Command = 'ALTER TABLE dbo.' + QUOTENAME(@Tablename) + ' DROP CONSTRAINT ' + QUOTENAME(@IndexName) + ';
    ALTER TABLE dbo.' + QUOTENAME(@Tablename) + ' ADD PRIMARY KEY (varnumber, subjectID, userID, datasetID, listid, userVarTitle);'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多