web-dev-qa-db-ja.com

テーブル列から一意制約を削除する方法は?

次のように定義された「ログイン」列を持つテーブル「ユーザー」があります:

[login] VARCHAR(50) UNIQUE NOT NULL

ここで、SQLスクリプトを使用してこの一意の制約/インデックスを削除します。ローカルデータベースでその名前Q _users_ 7D78A4E7を見つけましたが、別のデータベースで異なる名前を持っていると思います。

この一意の制約を削除する最良の方法は何ですか?または、少なくとも...

ありがとう。

20
SKINDER

SKINDER、コードは列名を使用しません。正しいスクリプトは次のとおりです。

declare @table_name nvarchar(256)  
declare @col_name nvarchar(256)  
declare @Command  nvarchar(1000)  

set @table_name = N'users'
set @col_name = N'login'

select @Command = 'ALTER TABLE ' + @table_name + ' drop constraint ' + d.name
    from sys.tables t 
    join sys.indexes d on d.object_id = t.object_id  and d.type=2 and d.is_unique=1
    join sys.index_columns ic on d.index_id=ic.index_id and ic.object_id=t.object_id
    join sys.columns c on ic.column_id = c.column_id  and c.object_id=t.object_id
    where t.name = @table_name and c.name=@col_name

print @Command

--execute (@Command)
21
Rail
ALTER TABLE users
DROP CONSTRAINT 'constraints_name'
33
Avadhesh

これは主に機能します。

drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO
7
fluidguid

UNIQUE制約を削除するには、制約の名前は必要ありません。制約に含まれる列のリストだけが必要です。

構文は次のとおりです。

ALTER TABLE table_name DROP UNIQUE (column1, column2, . . . )
6
juliG

次のSQLコマンドを使用して、一意の制約を削除します。

ALTER TABLE tbl_name
DROP INDEX column_name
3
beginner

この声明は私のために働く

  ALTER TABLE table_name DROP UNIQUE (column_name);
1
Vaseph

次のスクリプトを使用できます。

Declare @Cons_Name NVARCHAR(100)
Declare @Str NVARCHAR(500)

SELECT @Cons_Name=name
FROM sys.objects
WHERE type='UQ' AND OBJECT_NAME(parent_object_id) = N'TableName';

---- Delete the unique constraint.
SET @Str='ALTER TABLE TableName DROP CONSTRAINT ' + @Cons_Name;
Exec (@Str)
GO
1
sikarnarender

私は同じ問題に直面し、これで解決したので、前の質問を参照したいと思います solution 。まず、制約は常に名前にHash値を使用して構築されます。問題は、このHASHが異なるマシンまたはデータベースによって異なることです。例えば ​​DF__Companies__IsGlo__6AB17FE4 ここに 6AB17FE4はハッシュ値(8ビット)です。だから、私はすべての人に実りある単一のスクリプトを参照しています

DECLARE @Command NVARCHAR(MAX)
     declare @table_name nvarchar(256)
     declare @col_name nvarchar(256)
     set @table_name = N'ProcedureAlerts'
     set @col_name = N'EmailSent'

     select @Command ='Alter Table dbo.ProcedureAlerts Drop Constraint [' + ( select d.name
     from 
         sys.tables t
         join sys.default_constraints d on d.parent_object_id = t.object_id
         join sys.columns c on c.object_id = t.object_id
                               and c.column_id = d.parent_column_id
     where 
         t.name = @table_name
         and c.name = @col_name) + ']'

    --print @Command
    exec sp_executesql @Command

デフォルトの制約が削除されます。ただし、もう一度作成する場合は、これを試すことができます

ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]

最後に、単にDROPコマンドを実行して列をドロップします。

0
gdmanandamohon

制約の名前がわかっている場合は、次のようなコマンドを直接使用できます

テーブルのユーザーが制約constraint_nameを削除;

制約名がわからない場合は、このコマンドを使用して制約を取得できます

table_name = 'YOUR TABLE NAME';のuser_constraintsからconstraint_name、constraint_typeを選択;

0
Ramki

同じ問題がありました。 DB2を使用しています。私がやったことは少し専門的なソリューションではありませんが、すべてのDBMSで機能します:

  1. 一意の制約なしで同じ定義の列を追加します。
  2. 元の列の値を新しい列にコピーします
  3. 元の列を削除します(そのため、DBMSはその名前に関係なく制約も削除します)
  4. そして最後に新しいものを元の名前に変更します
  5. 最後に再編成(DB2のみ)
ALTER TABLE USERS ADD COLUMN LOGIN_OLD VARCHAR(50) NOT NULL DEFAULT '';
UPDATE USERS SET LOGIN_OLD=LOGIN;
ALTER TABLE USERS DROP COLUMN LOGIN;
ALTER TABLE USERS RENAME COLUMN LOGIN_OLD TO LOGIN;

CALL SYSPROC.ADMIN_CMD('REORG TABLE USERS');

ALTERコマンドの構文は、他のDBMSでは異なる場合があります

0
PowR

次のようなスクリプトで停止しました(このテーブルにはone非クラスター化ユニークインデックスしかありません):

declare @table_name nvarchar(256)  
declare @col_name nvarchar(256)  
declare @Command  nvarchar(1000)  

set @table_name = N'users'
set @col_name = N'login'

select @Command = 'ALTER TABLE ' + @table_name + ' drop constraint ' + d.name
    from sys.tables t join sys.indexes d on d.object_id = t.object_id  
    where t.name = @table_name and d.type=2 and d.is_unique=1

--print @Command

execute (@Command)

この解決策が受け入れられるかどうか誰かがコメントしていますか?長所と短所はありますか?

ありがとう。

0
SKINDER

データベース名に展開>>テーブルに展開>>キーに展開>>キーの名前をコピーして、以下のコマンドを実行します。

ALTER TABLE Test DROP UQ__test__3213E83EB607700F;

ここでQ__test__3213E83EB607700Fは、テストテーブルの特定の列に作成された一意のキーの名前です。

0
Jason Clark