2009-08-02 4 views
1

私は 'ScreenId'と 'ActivityItemId'を使用して複合プライマリキーを持つtable1というテーブルを持っています。私はNOT NULL制約を持つ新しいフィールド 'ProductId'を追加しました。 ProductIdを複合主キーに追加したいと思います。SQL(アクセス) - コンポジットプライマリキーに新しいフィールドを追加

私は

これは

db.execute "ALTER TABLE TABLE1 PRIMARY KEY(ScreenId、ActivityItemId、のProductId)" を働くだろうと思ったが、私はエラーを取得し、私が作成するときに、この構文は唯一うまくいくと思います表。

誰でもSQLを手伝ってくれますか? (私は実際にSQLを実行するために、ルビー・インターフェースを使用しています、ここところでVisual Basicのソリューションを使用することはできませんので、それだけでSQLにする必要があります)

おかげ

答えて

6

しよう 最大新しいものを作成し、あなたの現在の主キーをドロップすると:

ALTER TABLE TABLE1のDROP CONSTRAINT PK_NAME

ALTER TABLEのTABLE1のADD制約は、PRIMARY KEY(ScreenId、ActivityItemId、のProductIdを)PK_NAME

+0

ありがとうHawx - しかし私はこのエラーを受け取ります Microsoft JETデータベースエンジンのOLEエラーコード:80004005 CHECK制約 '主キー'が存在しません。 私はこれを実行していました - これは正しい構文ではないかもしれませんか? "ALTER TABLE table1 DROP CONSTRAINT [PrimaryKey]" –

+1

[Primary Key]の代わりにプライマリキー名を使用してください。 –

+0

ああ、私は 私は怖いまだ運N \「ここにあなたの変数を挿入」のように角括弧を参照してください - 私はこれを実行しています: ALTER TABLE活動DROP CONSTRAINT ScreenId と私は戻って このエラーが発生します。 CHECK制約 'ScreenId'が存在しません。 ScreenIdは間違いなくこのテーブルの主キーフィールドの1つです。 これはアクセスDBです - アクセスに多分異なる構文が必要ですか? ありがとう - 最大 –

3

を考えてみてコンポジットキーではなくサロゲートキーです。ビジネスロジックが変更されるたびにスキーマを変更する必要はありません。

これらの関係を一意の制約として保持し、代理キーを追加する価値があります。

+1

+1:変更が実際にプライマリではない「複合プライマリキー」。それは変更されたので、「行のための唯一の識別子」ではありません。複合キーを通常のインデックスにして、ユニークな代理キーを追加してください。 –

+0

ありがとうDuffymo。これは実際に私のビジネスロジックではなく、私たちのビジネスにアクセスすることはありません:)それは本当に単なる仕事です。
私は問題を解決するためにサロゲートキーを使用するのに嫌悪感はないと言いましたが、以前はその言葉を聞いていませんでした。私はそれを見上げるでしょう。 –

+0

非常に良い、最大。 Accessを使用している場合は、型名がAutoNumberのidという名前の列を追加しても問題ありません。他の列には一意制約を使用します。 – duffymo

-1

SQLを使用する代わりに、デザインビューで主キーを変更しようとしましたか?

+0

-1彼らは言った、 "私は実際には、SQLを実行するためにルビーインターフェイスを使用しているので、それはちょうどSQLである必要があります"。 – onedaywhen

+0

OOP!私の悪い。私はまだ、この作業を達成するために、デザインビューインターフェースがどのような回転をするのか不思議です。 Maxは彼が落とそうとしていた制約の名前を付ける方法を学ぶとすぐに彼が探していた解決策を得ました。終わりよければ全てよし。 –

+0

私は、PKの列のoderを指定する方法、すなわちScreenId、次にActivityItemId、ProductIdの順番をどのように指定するかはわかりません。これは、AccessデータベースエンジンがPKを使用してディスク上のデータを物理的にクラスタリングすると考えるとき、非常に重要です。 UIが常に他の列の後に新しい列を追加するとどうなりますか?それがあったかどうかを調べるには?未知のため、SQL DDLを使用する方が安全です。 – onedaywhen

関連する問題