Aus Versehen habe ich die Autoincrement-Option aus dem ID-Feld meiner Tabelle entfernt. Kann mir jemand sagen, wie ich die Option der Autoincrement zurück durch Migration einfügen kann?Automatisches Inkrementieren zurück zur Primärschlüsselspalte in Rails hinzufügen
13
A
Antwort
18
Versuchen:
change_column :my_table, :id, :primary_key
oder
my_table.change_column :id, :primary_key
Bestimmte Rails Datenbank-Adapter können Sie change_column
auf dem Primärschlüssel nicht zulassen nennen. Wenn das der Fall ist, dann können Sie immer execute
rufen Sie die Änderung mit SQL direkt ausführen:
MySQL:
execute('ALTER TABLE "my_table" CHANGE "id" "id"
bigint DEFAULT NULL auto_increment PRIMARY KEY')
PostgreSQL (Methode 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 (Methode 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"})
Wenn Sie nicht wollen, bigint
verwenden/bigserial
(64-Bit), verwenden Sie stattdessen int(11)
/integer
/serial
.
1
Ihr Postgres-Code funktioniert nicht, es ist unmöglich, Serial oder Bigserial in einer ALTER TABLE-Anweisung zu verwenden. Richtige SQL for PostgreSQL ist
ALTER TABLE table ALTER COLUMN id TYPE int
ALTER TABLE table ALTER COLUMN id TYPE bigint
3
ich nicht andere Versionen haben prüfen, aber auf Rails 5 kann man einfach stellen Sie die auto_increment
Option:
change_column :table_name, :id, :int, null: false, unique: true, auto_increment: true
Oder, wenn Sie einen bigint:
change_column :table_name, :id, :bigint, null: false, unique: true, auto_increment: true
Verwandte Themen
- 1. Automatisches Inkrementieren der Paste
- 2. Automatisches Inkrementieren eines Nicht-Primärschlüsselfelds in Ruby on Rails
- 3. Automatisches Inkrementieren einer Spalte in SQLite ändern
- 4. Automatisches Inkrementieren der ID im Kontaktformular 7
- 5. Hinzufügen des Cookie-Sitzungsspeichers zurück zur Rails-API-App
- 6. Schaltfläche "Zurück" zur Navigationsleiste hinzufügen
- 7. Funktionen hinzufügen Zurück zur variablen
- 8. Automatisches Inkrementieren um 1 in MySQL mit clearDB
- 9. atomisches Einfügen oder Inkrementieren in ActiveRecord/Rails
- 10. hinzufügen Primärschlüsselspalte in eine ohne primay Schlüssel alte Tabelle
- 11. Hinzufügen von UIView zurück zur Ansicht
- 12. Rails has_many: through -> Soll ich eine Primärschlüsselspalte behalten?
- 13. Automatisches Kommentarmodell bei Migration in Rails?
- 14. Problem mein Primärschlüsselspalte Seeding
- 15. Hinzufügen einer CSS-Klasse zur Auswahl in Rails
- 16. Rails - Hinzufügen von benutzerdefinierten Feldern zur Laufzeit in ActiveRecord
- 17. Zurück zur Verwendung des Prototyps
- 18. javafx tableview automatisches Scrollen bis zur letzten
- 19. jQuery Backstretch Bild automatisches Verschieben und zurück
- 20. UICollectionView automatisches Scrollen zur Zelle bei IndexPath
- 21. Sollte ich Primärschlüsselspalte in Oracle indexieren
- 22. Automatisches Hinzufügen von Wasserzeichen zu einem Bild
- 23. Zurück zur Revision in Subversion
- 24. Nach dem Hinzufügen von Datensatz PHP zurück zur vorherigen Seite
- 25. Docker Volumes - Automatisches Hinzufügen von Dateien
- 26. Dashing Gem Dashboard zur bestehenden Rails App hinzufügen?
- 27. Rails 4 ToDo-Liste, Hinzufügen von Zeilen zur Tabelle
- 28. Wie kann ich "link_to 'Zurück zum Suchergebnis'" Feature hinzufügen Rails
- 29. Rails Shoppe Gem: kann kein Produkt zur Bestellung hinzufügen
- 30. Inkrementieren einer Zahl und Hinzufügen einer führenden Null in Bash
Thnx für Ihre Antwort, aber ich habe tatsächlich bereits change_column auf einigen der Primärschlüssel getan. Vielleicht ist das der Grund, warum es die bereits bestehende Auto Increment-Option aus der Primärschlüssel-Option entfernt. –
Kein Problem. Siehe mein Update. – vladr