18

誤って、テーブルの id フィールドから自動インクリメント オプションを削除してしまいました。移行を通じて自動インクリメントのオプションを再挿入する方法を誰か教えてもらえますか?

4

6 に答える 6

20

試す:

change_column :my_table, :id, :primary_key

また

my_table.change_column :id, :primary_key

change_column一部の Rails データベース アダプタでは、主キーを呼び出せない場合があります。その場合は、executeSQL を直接使用していつでも呼び出して変更を実行できます。

MySQL:

execute('ALTER TABLE "my_table" CHANGE "id" "id"
  bigint DEFAULT NULL auto_increment PRIMARY KEY')

PostgreSQL (方法 1):

max_id = execute(%%Q{SELECT id FROM "my_table" ORDER BY "id" DESC
  LIMIT 1}).to_a.first
execute(%%Q{CREATE SEQUENCE "my_table_id_seq" START #{max_id+1}})
execute(%%Q{ALTER TABLE "my_table" ALTER COLUMN "id"
  TYPE bigint})
execute(%%Q{ALTER TABLE "my_table" ALTER COLUMN "id"
  SET DEFAULT nextval('my_table_id_seq'::regclass)})
execute(%%Q{ALTER TABLE "my_table" ADD PRIMARY KEY("id")}) 

PostgreSQL (方法 2):

max_id = execute(%%Q{SELECT "id" FROM "my_table" ORDER BY "id" DESC
  LIMIT 1}).to_a.first
execute(%%Q{ALTER TABLE "my_table" RENAME COLUMN "id" TO "id_orig"})
execute(%%Q{ALTER TABLE "my_table" ADD COLUMN "id" bigserial NOT NULL})
execute(%%Q{UPDATE "my_table" SET "id"="id_orig"})
execute(%%Q{ALTER SEQUENCE "my_table_id_seq" RESTART #{max_id+1}})
execute(%%Q{ALTER TABLE "my_table" DROP COLUMN "id_orig"})

bigint/ bigserial(64 ビット)を使用したくない場合は、代わりにint(11)/ integer/を使用してください。serial

于 2009-03-05T15:34:45.273 に答える
1

Postgres コードが機能しません。ALTER TABLE ステートメントで serial または bigserial を使用することはできません。PostgreSQL の正しい SQL は

ALTER TABLE table ALTER COLUMN id TYPE int 
ALTER TABLE table ALTER COLUMN id TYPE bigint
于 2009-07-30T11:09:19.497 に答える