2009-10-18 17 views
11

यह ActiveRecord में auto_increment झंडा बिना प्राथमिक कुंजी बनाने के लिए संभव है बंद करने के लिए?कैसे रेल में auto_increment सक्रिय रिकॉर्ड

मैं

create table :blah, :id => false 

ऐसा नहीं कर सकते, क्योंकि मैं स्तंभ पर प्राथमिक कुंजी सूचकांक करना चाहते हैं। मैंने documentation देखा लेकिन कुछ भी उपयोगी नहीं मिला।

क्या auto_increment के बिना प्राथमिक कुंजी बनाना संभव है?

उत्तर

12

इसे आजमाएं?

create_table(:table_name, :id => false) do |t| 
    t.integer :id, :options => 'PRIMARY KEY' 
end 
+3

यह मेरे लिए mysql2 एडाप्टर और रेल 3.2 के साथ काम नहीं करता है।13 –

6

वह मेरे लिए काम नहीं किया है, लेकिन निम्नलिखित किया:

create_table(:table_name, :id => false) do |t| 
    t.column :id, 'int(11) PRIMARY KEY' 
end 

केवल समस्या यह है कि आप इसे schema.rb में खो देते हैं।

8

ठीक है, सवाल पुराना है और ओपी ने संस्करण निर्दिष्ट नहीं किए हैं।

class SomeMigration < ActiveRecord::Migration 
    # emulate a primary_key column without auto-increment 
    # the solution here is to use a non-null integer id column with a unique index 
    # this is semantically different from PRIMARY KEY in mysql but not 
    # _too_ functionally different, the only difference is that mysql enforces 
    # no-more-than-one-primary-key but allows >1 unique index 
    def up 
    create_table :foobars, :id => false do |t| 
     t.integer :id, :null => false 
     t.string :name 
    end 
    add_index :foobars, :id, :unique => true 
    end 
end 

मुझे आशा है कि समय बिताने इस पर नज़र रखने से वहाँ किसी की बचत होती है, या बुरा:

mysql2 0.3.11 
rails 3.2.13 
mysql 5.5 

मैं इसके लिए जा रहा समाप्त हो गया: यहां दिए गए उत्तर से कोई भी इन संस्करणों के साथ मेरे लिए काम किया ... यह जांचने के बिना उत्तर का उपयोग कर रहा है कि यह डीबी के साथ क्या करता है ... क्योंकि या तो सॉजनर या जिम के उत्तरों (निर्भरताओं के मेरे संस्करणों के साथ) का उपयोग यह है कि माइग्रेशन ठीक चलता है लेकिन नल आईडी की अनुमति है, और डुप्लिकेट आईडी अनुमति हैं। मैंने शेप के जवाब की कोशिश नहीं की क्योंकि मुझे डीबी/स्कीमा.आरबी असंगत होने का विचार पसंद नहीं है (उस कमी के बारे में स्पष्ट होने के लिए शेप को +1, कभी-कभी यह एक बुरी चीज होगी)

मैं हूं यकीन नहीं इस के महत्व है, लेकिन इस समाधान के साथ, mysql describe यह एक प्राथमिक कुंजी के रूप में, एक ही डिफ़ॉल्ट के साथ एक एआर तालिका के रूप में दिखाता है:

एआर डिफ़ॉल्ट के साथ तालिका: आईडी ... में के रूप में आईडी

+---------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+---------------------+--------------+------+-----+---------+----------------+ 
| id     | int(11)  | NO | PRI | NULL | auto_increment | 

मेरे समाधान के साथ तालिका:

+--------------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+--------------+--------------+------+-----+---------+-------+ 
| id   | int(11)  | NO | PRI | NULL |  | 

जो कि दिलचस्प है क्योंकि मेरे समाधान के साथ माइग्रेशन द्वारा उत्पन्न एसक्यूएल में "प्राथमिक कुंजी" (बेशक) शामिल नहीं है ... लेकिन एआर डिफ़ॉल्ट के साथ: आईडी यह करता है ... तो ऐसा लगता है कि कम से कम mysql describe व्यवहार करता है एक गैर-शून्य अद्वितीय-अनुक्रमित एक प्राथमिक कुंजी

HTH किसी

+0

यदि आप 'id_index: id' के अपने दृष्टिकोण का उपयोग करते हैं, तो 'add_index: id' को हटाएं और इसके बजाय' निष्पादित करें 'का उपयोग करें तालिका तालिका को प्राथमिक कुंजी (आईडी) जोड़ें;'' create_table' के बाद, ' आपको एक वास्तविक प्राथमिक कुंजी कॉलम और अनुक्रमणिका मिल जाएगी। यह एएनएसआई एसक्यूएल-9 2 अनुपालन डीडीएल होना चाहिए। – ches

+1

हालांकि यह इसे 'schema.rb' में नहीं लाएगा, ओह। – ches

+0

@ches यही कारण है कि मैंने उस विचार को त्याग दिया :) –

4

के रूप में कुंजी के लिए आप इस प्रकार का टेबल बना सकते हैं:

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :routers, { id: false } do |t| 
     t.integer :id 
    end 

    execute "ALTER TABLE routers ADD PRIMARY KEY (id);" 
    end 
end 

और वह वास्तव में रेल 4.0.2 में काम करता है और Postgresql 9.3.2।

+0

ऐसा लगता है मैं रेल 4.2 और MySQL के लिए क्या चाहता था ... मैंने थोड़ा बदल दिया 't.integer: id, null: false' – Intentss

संबंधित मुद्दे