Comment désactiver auto_increment dans les Rails Active Record
Est il possible de créer une clé primaire sans auto_increment
drapeau dans ActiveRecord?
Je ne peux pas faire
create table :blah, :id => false
parce que je veux avoir un index de clé primaire sur la colonne. J'ai regardé la documentation mais n'ai pas trouvé quelque chose d'utile.
Est il possible de créer une clé primaire sans auto_increment?
OriginalL'auteur Jakub Arnold | 2009-10-18
Vous devez vous connecter pour publier un commentaire.
Essayer ce?
OriginalL'auteur Jim
Ok, la question est ancienne et que l'OP n'a pas précisé les versions. Aucune réponse n'est donnée ici a fonctionné pour moi avec ces versions:
J'ai fini par aller à cela:
J'espère que sauve quelqu'un là-bas à partir des dépenses de suivi du temps de cela, ou pire ... à l'aide de la réponse sans vérifier ce qu'il fait à la db ... parce que le résultat soit un étranger ou de jim réponses (avec mes versions des dépendances), c'est que la migration se passe bien, mais NULLE id sont autorisés, et id en double sont autorisés. Je n'ai pas essayer Shep réponse parce que je n'aime pas l'idée de db/schema.rb à l'encontre de la (+1 à Shep pour être plus explicite à propos de cette lacune, il arrive que ce serait une Mauvaise Chose)
Je ne suis pas sûr de la signification de ceci, mais avec cette solution, mysql
describe
le montre comme une clé primaire, de même qu'un AR table avec par défaut :id ... comme dans:table avec AR défaut :id
table avec ma solution:
qui est assez intéressant parce que le SQL généré par la migration de ma solution ne comprend pas "CLÉ PRIMAIRE" (bien sûr) ... mais avec AR défaut :id qu'il fait ... il semble donc mysql, au moins pour
describe
traite un non-null unique indexés clé comme clé primaireHTH quelqu'un
:id => false
, supprimez leadd_index :id
et au lieu d'utiliserexecute 'ALTER TABLE foobars ADD PRIMARY KEY (id);'
après lacreate_table
, vous obtiendrez une véritable colonne de clé primaire et de l'index. Cela devrait être la norme ANSI SQL-92 conforme DDL.Bien qu'il ne le fera pas dans
schema.rb
, pouah.c'est exactement pourquoi j'ai renoncé à cette idée 🙂
Seul le add_index méthode a besoin d'un changement, je pense qu'il devrait être
add_index :foobars, :id, :unique => true
, sinon il me faisait une erreur.Bonne solution @BlakeMiller -- pour le faire fonctionner (je suis à l'aide de Rails 5.1.3) j'ai également eu à ajouter à la partie supérieure du modèle de la classe:
self.primary_key = 'id'
OriginalL'auteur Blake Miller
Qui n'a pas fonctionné pour moi, mais les suivantes:
Seul problème, c'est que vous le perdez dans le schéma.rb.
OriginalL'auteur Shep
Vous pouvez créer un tableau comme ceci:
Et qui fonctionne vraiment dans les Rails 4.0.2 et Postgresql 9.3.2.
t.integer :id, null: false
OriginalL'auteur Eric Wu
La désactivation de l'auto incrément comme des Rails 5, vous pouvez tout simplement passer
par exemple
t.primary_key :some_id
OriginalL'auteur Curious Sam
Dans les Rails 5 vous pouvez faire
Si vous souhaitez modifier le nom de la colonne clé primaire pass primary_key paramètre:
Voir create_table documentation.
OriginalL'auteur Pavel Chuchuva
Avis: Depuis Rails 5.1 par défaut des clés primaires sont de type bigint. http://www.mccartie.com/2016/12/05/rails-5.1.html
Si vous voulez que 4 octets clé du changement :bigint :integer
OriginalL'auteur albertm