24

'login'列が次のように定義されたテーブル'users'があります。

[login] VARCHAR(50) UNIQUE NOT NULL

次に、SQLスクリプトを使用してこの一意の制約/インデックスを削除します。ローカルデータベースでUQ_users_7D78A4E7という名前を見つけました、別のデータベースでは別の名前になっていると思います。

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

ありがとう。

4

16 に答える 16

36
ALTER TABLE users
DROP CONSTRAINT 'constraints_name'

以前のconstraints_nameが指定されていない場合は、デフォルトのconstraint_nameがあります。pgAdmin4(pSql)で、制約に違反してみてください。受け取ったエラーでconstraint_nameに違反していることがわかります。おそらく、他のプラットフォームまたはそこにある場合と同じである必要があります。 Web上で利用可能ないくつかの記事で、constraint_nameは、それらが格納されている特定のテーブルから抽出されますが、これについてはよくわかりません。PS:コメントからも参照できます

于 2011-03-31T13:37:54.360 に答える
26

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)
于 2012-02-10T14:14:44.717 に答える
10

これは主に機能します。

drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO
于 2014-10-03T18:15:48.057 に答える
8

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

構文は次のようになります。

ALTER TABLE table_name DROP UNIQUE (column1, column2, . . . )
于 2014-11-26T20:03:40.710 に答える
3

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

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
于 2013-01-01T12:40:11.433 に答える
3

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

ALTER TABLE tbl_name
DROP INDEX column_name
于 2015-04-23T02:56:32.157 に答える
2

このステートメントは私のために働きます

  ALTER TABLE table_name DROP UNIQUE (column_name);
于 2016-09-19T13:36:57.963 に答える
0

以下のようにスクリプトを停止しました(このテーブルにはクラスター化されていない一意のインデックスが1つしかないため)。

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)

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

ありがとう。

于 2011-03-31T15:28:09.343 に答える
0

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

ALTER TABLE Test DROP UQ__test__3213E83EB607700F;

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

于 2016-12-20T04:53:59.210 に答える
0

私は同じ問題に直面し、この解決策によって解決したので、前の質問を参照したいと思います。まず第一に、制約は常にその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最後に、コマンドを実行して列を削除するだけです。

于 2017-06-06T06:56:06.700 に答える
0

私も同じ問題を抱えていました。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では異なる場合があります

于 2019-08-20T15:18:19.587 に答える
0

SQLが制約を削除するため

ALTERTABLE[dbo]。[tablename]DROPCONSTRAINT[SQLによって作成された一意のキー]GO

または、キーに移動します。一意のキーを右クリックし、新しいSQLエディターウィンドウでドロップ制約をクリックします。プログラムがコードを作成します。

お役に立てれば。消える。

于 2019-12-06T17:43:36.950 に答える
0

すべてのシステムで生成された一意の制約名とそれに関連するその他の情報をデータベースで検索します。

以下のクエリを使用して、必要に応じて拡張できます。

SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE CONSTRAINT_NAME LIKE '%UQ%'

データベースを介してすべての一意性制約を削除するための最終クエリ。where句を追加して、1つのテーブルに制限することができます。

    DECLARE @uqQuery NVARCHAR(MAX)
    SET @uqQuery = SUBSTRING( (SELECT '; ' + 'ALTER TABLE [' + Table_Schema+'].['+Table_Name
        +']  DROP CONSTRAINT ['+CONSTRAINT_NAME+']'

    FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE CONSTRAINT_NAME LIKE '%UQ%'
    FOR XML PATH('')), 2,  2000000)
    SELECT @uqQuery
于 2020-05-07T12:51:36.330 に答える
0
   ALTER TABLE dbo.table
DROP CONSTRAINT uq_testConstrain

制約名uq_testConstrainは、database->table->keysフォルダーにあります。

于 2020-12-02T07:37:45.690 に答える
0

次のコードを使用するMSSQLの場合

IF  EXISTS(SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu WHERE TABLE_NAME = 'tableName' and COLUMN_NAME = 'colName')
BEGIN 
Declare @con varchar(50);
Declare @sqlStatement varchar(500);

select @con = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu WHERE TABLE_NAME = 'tableName' and COLUMN_NAME = 'colName'
SET @sqlStatement = 'ALTER TABLE tableName DROP CONSTRAINT ' + @con;
    
EXECUTE (@sqlStatement)
END
GO
于 2021-07-22T06:10:05.583 に答える
-1

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

テーブルユーザーの変更は制約constraint_nameを削除します。

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

user_constraintsからconstraint_name、constraint_typeを選択します。ここでtable_name ='YOUR TABLE NAME';

于 2016-04-12T05:27:19.583 に答える