Per errore ho rimosso l'opzione autoincrement dal campo id della mia tabella. Qualcuno può dirmi come posso reinserire l'opzione di autoincremento attraverso la migrazione?Aggiungi incremento automatico alla colonna chiave primaria in Rails
13
A
risposta
18
Prova:
change_column :my_table, :id, :primary_key
o
my_table.change_column :id, :primary_key
Alcuni Rails adattatori del database non possono lasciare che si chiama change_column
sulla chiave primaria. Se questo è il caso, allora si può sempre chiamare execute
per eseguire il cambio utilizzando direttamente SQL:
MySQL:
execute('ALTER TABLE "my_table" CHANGE "id" "id"
bigint DEFAULT NULL auto_increment PRIMARY KEY')
PostgreSQL (metodo 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 (metodo 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"})
Se non si desidera utilizzare bigint
/bigserial
(64-bit), utilizzare invece int(11)
/.
1
Il codice Postgres non funziona, è impossibile utilizzare seriale o bigserial in un'istruzione ALTER TABLE. SQL corretto per PostgreSQL è
ALTER TABLE table ALTER COLUMN id TYPE int
ALTER TABLE table ALTER COLUMN id TYPE bigint
3
non ho controllato le altre versioni, ma on Rails 5 si può semplicemente impostare l'opzione auto_increment
:
change_column :table_name, :id, :int, null: false, unique: true, auto_increment: true
O se volete un bigint:
change_column :table_name, :id, :bigint, null: false, unique: true, auto_increment: true
Problemi correlati
- 1. mysql, modifica colonna rimuovi chiave primaria e incremento automatico
- 2. Mysql - Aggiungi auto_increment alla chiave primaria
- 3. Proprietà incremento automatico non chiave
- 4. Chiave primaria con incremento automatico nelle tabelle SQL
- 5. Modello Django Incremento automatico Chiave primaria basata su chiave esterna
- 6. Come impostare la chiave primaria con incremento automatico in MongoDB?
- 7. SQL Server: arbitraria di incremento automatico della chiave primaria
- 8. Campo di incremento automatico di Django BigInteger come chiave primaria?
- 9. SQLAlchemy Ottieni chiave primaria con incremento automatico prima dell'impegno
- 10. Rileva colonna incremento automatico
- 11. SQLite aggiungi chiave primaria
- 12. SQL Aggiungi chiave esterna alla colonna esistente
- 13. come aggiungere una nuova colonna alla chiave primaria composita esistente
- 14. Come modificare la colonna chiave primaria in Grails?
- 15. Aggiungi alla lista vs. Incremento
- 16. Inserire una chiave primaria con incremento automatico in una tabella di accesso
- 17. Incremento automatico per Oracle
- 18. incremento automatico multiplo in mysql
- 19. Definizione chiave composita con incremento automatico in MySQL
- 20. C'è qualche vantaggio nell'avere una chiave primaria a incremento automatico in una tabella pivot MySQL?
- 21. PHP mySQL - Inserire un nuovo record nella tabella con incremento automatico sulla chiave primaria
- 22. Chiave primaria di incremento automatico in SQL Server Management Studio 2012
- 23. LINQ to SQL inserto con chiave primaria come tinyint impostato incremento automatico dà messaggio di errore
- 24. Errore nell'uso di System.Data.Linq.Mapping e incremento automatico della chiave primaria in un dl sqlite
- 25. Come aggiungere una chiave primaria a incremento automatico a una tabella esistente, in PostgreSQL?
- 26. Problema con colonna "id" con incremento automatico
- 27. autoincremento chiave primaria nel database Oracle
- 28. Aggiungere la chiave primaria alla tabella esistente
- 29. Esiste un incremento automatico in sqlite?
- 30. Perché utilizzare una chiave primaria a incremento automatico quando esistono altri campi univoci?
Thnx per la risposta, ma in realtà ho già fatto change_column su alcune delle chiavi primarie. Potrebbe essere il motivo per cui ha rimosso l'opzione Auto Increment già esistente dall'opzione chiave primaria. –
Nessun problema. Vedi il mio aggiornamento. – vladr