2016-10-04 5 views
3

SSMSを使用して既存のテーブルにPurchaseOrderIDという新しい列を作成したいとします。それはLineNumberPONUMBERを組み合わせて代理キーを作成し、テーブルというモードを入力してそこにPKを割り当てます。既存のテーブルに代理キー列を作成するにはどうすればよいですか?

ALTER TABLE FactPurchaseOrders 
ADD PurchaseOrderID VARCHAR(64); 

値を取り込み:

新しい列の作成私はPKこのコラムを割り当てることができませんこれで現在

UPDATE FactPurchaseOrders 
SET PurchaseOrderID = (CONVERT(VARCHAR(64), LineNumber) + CONVERT(VARCHAR(64), PONUMBER)) 
WHERE 1=1; 

をし、それがNULL可能であるので、私は信じています。 デザインモードで最初に作成しようとしましたが、同じ問題が発生します。最も確かにそうである

Error when trying to save PK

+0

うまくいけば、私は何かが欠けていないんだけど、あなたは列の値を更新した後、あなたは '許可を確認した上でPKを作成しますテーブルデザイナで「Nulls」チェックボックスを選択し、PK制約を追加する前に定義を保存しますか? – bassrek

+0

また、検証のポイントとして、 '' PurchaseOrderID、COUNT(*)からFactPurchaseOrders GROUP BY PurchaseOrderID HAVING COUNT(*)> 1'を実行して、PK制約が作成されない重複行がないことを確認できます。 – bassrek

+0

なぜその列を作成していますか?効果的に計算された列を作成することは、本当に悪い考えです。両方の列でPKを作成するだけです。それが何らかの理由で(単一列のPKだけをサポートする非常に不十分なフロントエンドのように)不可能な場合は、計算された列にします。それは基本的なデータベース設計原則に違反しようとしており、結果として苦痛の世界に向かいつつあります。 –

答えて

2

。更新プログラムを実行した後、PKで使用する列をNOT NULLに変更するだけです。列は値を持つので、NOT NULLとして設定することができます。次に、PKの割り当てを許可します。また既にテーブルにもう1つのPKがないことを確認してください。 1つしかない!

  1. 更新レコード
  2. アルター列
  3. nullではないが、フィールド
+0

[このメッセージ](https://gyazo.com/c0800e1b79dd15208bf822ecc84fbd6f)は、私がPKを割り当てて保存しようとした後にポップアップします。 –

+0

@JonathanPorter fyi:原則として、外部の画像へのリンクは目立たない。画像が消えた場合、SOの値は減少する。画像にテキストが含まれている場合、人々は手書きでテキストを入力することを期待している可能性があります。データベースの質問のサンプルデータ。エラーメッセージの場合は、あなたの投稿やコメントにメッセージを引用するだけの方がいいでしょう。 – HABO

+1

@JonathanPorterはSQLを通してそれをやってみる。 ALTER TABLE ALTER COLUMN ColumnName VARCHAR(XX)は、GUIを使用する代わりにNULLではありません。 –

関連する問題