5

私は既存のRailsサイトでメンテナンス作業を行っていますが、多対多の関連付けに起因するいくつかの問題が発生しています。サイトは当初has_and_belongs_to_many、ビジネスロジックでより複雑になったいくつかの関係を使用して構築されたようです。そのため、has_many :through代わりに関係テーブルの追加フィールドをサポートするために使用する必要があります。ただし、最初にHABTMに使用された結合テーブルには主キーがないため、を使用した個別の関係モデリングをサポートするために主キーを追加する必要がありhas_many :throughます。

大量のデータを含む既存のテーブルに主キーを追加するための最良の方法は何ですか?私がやろうとしていることをする別の方法はありますか?

ちなみに、システムはOracle上で実行されています。

ありがとう!

ジャスティン

UPDATE 11/9/09 3:58 pm:私はOracleの専門家ではなく、Oracleのバージョンのnot null、auto-incrementなどの荒野で迷子になっています。最初は、主キーとして新しいフィールドを追加することで、MikeとCoreyが推奨することを実行しようとしましたが、Oracleは、空でないテーブル(ORA-01758)にnull以外のフィールドを追加することを許可しませんでした。次に、データをSQLとしてエクスポートし、行を削除し、PKを追加してnull以外に設定してから、データをインポートしようとしましたが、「IDにNULLを挿入できません...」というエラーが発生し続けました。 (ORA-01400)。

最後に、Coreyがコメントで示唆しているように移行を使用しようとしましたが、データベースを手動で変更したときにOracleがスローしたのと同じエラーがrakeにヒットしました(「空でないテーブルにnull以外のフィールドを追加できません」)。テーブルをクリアし、移行を実行して(これは機能しました)、データを再インポートしようとしましたが、前回インポートしようとしたときに同じエラーが発生しました(「IDにNULLを挿入できません...」)。データを保存して、必要な主キーを追加するにはどうすればよいですか?レーキタスクを書く可能性が示唆されたことは知っていますが、その前にどのように進めるかはわかりません。何か案は?

4

3 に答える 3

7

Oracleデータベースを管理するときにSQLDeveloper使用します。列を作成し、データベースに制約を追加するだけです。例:

sql> alter table Employee add constraint Employee_pk primary key(Employee_ID);

詳細については、こちらをご覧ください。

編集:

これを再考したので、移行でそれを実行できるはずです

add_column :table, :id, :primary_key

次に、移行内にいくつかのデータをシードする必要があります。繰り返してインデックスを追加するルビーコードだけです。ヘルプについては、 seed_fuおよびdb-populateを参照してください。Rails 3では、rake db:seedを使用してデータをシードできます。

于 2009-11-09T18:21:45.950 に答える
3

新しい列を作成し、PK値を入力してから、新しい列にPKを作成する必要があります。例:

SQL> create table no_pk_tab (c1 varchar2(10), c2 varchar2(10))
Table created.
SQL> insert into no_pk_tab values ('one', 'one')
1 row created.
SQL> insert into no_pk_tab values ('two', 'two')
1 row created.

SQL> alter table no_pk_tab add (id integer)
Table altered.

SQL> create sequence no_pk_seq
start with 1
increment by 1
Sequence created.

SQL> update no_pk_tab set id = no_pk_seq.nextval
2 rows updated.
SQL> select * from no_pk

C1         C2             PK_COL
---------- ---------- ----------
one        one                 1
two        two                 2

2 rows selected.

SQL> alter table no_pk add primary key (pk_col) using index
Table altered.

テーブル内の行数によっては、シーケンス値の入力に時間がかかる場合がありますが、機能します。

于 2009-11-10T12:23:28.357 に答える
1

表の変更を使用して、pk列を追加します。

新しいpk列の値を段階的に設定するスクリプトを記述します(ある種のループ)。

スクリプトが完了したら、alter tableを再度使用して、列をprimary_keyおよびauto-incrementに設定し、増分開始値をtable_size+1に設定します。

于 2009-11-09T18:32:43.417 に答える