2011-08-16 8 views
1

SQLについてはあまりよく分かりませんが、テーブルがあり、テーブルの下にKeysフォルダを展開してSSMSで見ることができるユニークなキー制約があります。 UNIQUEという名前の1つの列を作成します。私はSQLと制約について助けが必要です

今は完全にユニークですが、名前を変更する必要があるため、別の列の特定のID「catflapID」に固有の名前です。したがって、名前はテーブルに複製できますが、各catflapIDには重複はありません。

私はこれをどうやって行うのか絶対に分かりません。どうにかして既存の制約を削除し、新しい制約を追加するスクリプトを作成する必要があります。

アドバイスはありますか?

+0

SQL-Serverの 'ALTER TABLE':http://msdn.microsoft.com/en-us/ library/ms190273.aspx –

+1

そしてhttp://msdn.microsoft.com/en-us/library/ms187335%28v=sql.90%29.aspxあなたがCONSTRAINTの名前を見つけることができるようにするにはスクリプト。 –

+0

'ALTER TABLE TableName DROP CONSTRAINT ConstraintName;のようなもの –

答えて

1
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[test_table]') AND name = N'IX_test_table') 
ALTER TABLE [dbo].[test_table] DROP CONSTRAINT [IX_test_table] 
GO 

ALTER TABLE [dbo].[test_table] ADD CONSTRAINT [IX_test_table] UNIQUE NONCLUSTERED 
(
    [c_name] ASC, 
    [c_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
+0

これはすばらしいおかげです、現在のキーはランダムに生成されたUQ__CatFlap__86007E41267D1C7Fと呼ばれていますが、キーに他のサーバーの別の名前がある場合は、ドロップするための汎用スクリプトを作成する方法がわかりません。 – NibblyPig

+1

例: '名前をsysobjectsから選択してください ここでparent_obj =(sysobjectsからIDを選択して名前= 'test_table')AND xtype = 'UQ'' – Max

+1

Maxのコメントからスクリプトを使用してください変数に名前を格納します。その変数を文字列に注入します。その値はMaxの質問に対する答えですが、変数をオブジェクト名に置き換えてください。次に、sp_executesql(http://msdn.microsoft.com/en-us/library/ms175170.aspx)を使用して文字列を実行します。これは「動的SQL」と呼ばれ、実際にあなたが望むことを実行する唯一の一般的な方法です。このため、特に複数の本番サーバーがある場合は、常にオブジェクトに名前を付ける必要があります。 –

0

両方の列で複雑な一意制約を作成する必要があります。

あなたは関係-テーブルの外部キーを作成する必要があります(実際のテーブル名の変更「MyTableという」名)

ALTER TABLE MyTable ADD CONSTRAINT MyConstraint2 UNIQUE (catflapID, name) 
0

を既存の制約を削除し、このコードを実行します。例えば、表1に

CREATE TABLE table1 (catflapID INT NOT NULL PRIMARY KEY , ...) 
CREATE TABLE table2 (ID INT PRIMARY KEY , catflapID INT NOT NULL FOREIGN KEY REFERENCES Table1(catflapID)) 

catflapIDはNULLとPRIMARY KEYではないので、このフィールドは、一意になります。 Table2のcatflapIDはTable2から参照されるため、Table1の値のみを含むことができます。

0

新しい制約に

ALTER TABLE tab 
    ADD CONSTRAINT UniqueNameForCat UNIQUE (catflapID, name); 

を作成するには、古い、時代遅れの制約をドロップする

ALTER TABLE tab DROP CONSTRAINT oldConstraintName; 
関連する問題