Jak wyłączyć auto_increment na aktywnym wejściu w Railsach


Czy można utworzyć klucz podstawowy bez flagi
auto_increment
w

ActiveRecord

?
nie mogę tego zrobić
create table :blah, :id => false

ponieważ chcę mieć indeks klucza podstawowego w kolumnie. Obejrzałem się

dokumentacja
http://ar.rubyonrails.org/
ale nie znalazłem nic przydatnego.

Czy można utworzyć klucz podstawowy bez auto_increment?

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj tego?
create_table(:table_name, :id => false) do |t|
t.integer :id, :options => 'PRIMARY KEY'
end
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ok, pytanie jest stare, a PO nie rozwinęło wersji. Żadna z udzielonych tutaj odpowiedzi nie działała dla mnie w tych wersjach:
mysql2 0.3.11
rails 3.2.13
mysql 5.5

Skończyło się na tym:
<pre class="lang-rb prettyprint-override">
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

Mam nadzieję, że to uratuje kogoś przed marnowaniem czasu na śledzenie tego lub gorzej, ... używając odpowiedzi bez sprawdzania, co robi z DB ... ponieważ wynik użycia odpowiedzi sojournera lub Jima (z moimi wersjami zależności) jest taka, że ​​migracja jest prawidłowa, ale dozwolone są identyfikatory NULL, a duplikaty są dozwolone. Nie próbowałem odpowiedzieć Shepowi, ponieważ nie podoba mi się pomysł niespójności db/schema.rb (+1 dla Shep za mówienie bez ogródek o tej wadzie, czasami byłoby źle)
Nie jestem pewien, jakie to ma znaczenie, ale w tym rozwiązaniu mysql
opis
pokazuje go jako klucz podstawowy, taki sam jak tabela AR z domyślnym: id ... jak w:
domyślna tablica AR: id
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |

stół z moim rozwiązaniem:
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |

co jest dość interesujące, ponieważ SQL wygenerowany przez migrację z moim rozwiązaniem nie zawiera "KLUCZA PODSTAWOWEGO" (oczywiście) ... ale z domyślnym AR: id to robi ... więc wygląda na mysql przynajmniej dla
opisać
traktuje niezerowy, unikalny klucz indeksowany jako klucz podstawowy
Hth ktoś
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To nie zadziałało, ale zadziałało:
create_table(:table_name, :id => false) do |t|
t.column :id, 'int(11) PRIMARY KEY'
end

Jedynym problemem jest to, że tracisz go w schema.rb.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz utworzyć taką tabelę:
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

I to faktycznie działa w Railsach 4.0.2 i Postgresql 9.3.2.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby wyłączyć autoinkrementację w Rails 5, możesz po prostu przejść
default: nil

na przykład
create_table :table_name, id: :bigint, default: nil do |t|
# ... fields ...
end
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W Rails 5 możesz to zrobić
create_table :blah, id: :integer do |t|

Jeśli chcesz zmienić nazwę kolumny klucza podstawowego, przekaż parametr primary_key:
create_table :blah, id: :integer, primary_key: :my_awesome_id do |t|

Widzieć

dokumentacja create_table
http://api.rubyonrails.org/cla ... table
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

def change
create_table :tablename do |t|
# t.string :fieldname
end change_column :tablename, :id, :bigint, auto_increment: false
end

Zwróć uwagę, że od czasów Railsów 5.1 klucze podstawowe to domyślnie bigint.

http://www.mccartie.com/2016/12/05/rails-5.1.html
http://www.mccartie.com/2016/12/05/rails-5.1.html
Jeśli chcesz zmienić klucz 4-bajtowy: bigint na: integer

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się