create_table
- 1.0.0 (0)
- 1.1.6 (0)
- 1.2.6 (3)
- 2.0.3 (-1)
- 2.1.0 (1)
- 2.2.1 (20)
- 2.3.8 (0)
- 3.0.0 (38)
- 3.0.9 (-11)
- 3.1.0 (0)
- 3.2.1 (-1)
- 3.2.8 (0)
- 3.2.13 (0)
- 4.0.2 (1)
- 4.1.8 (30)
- 4.2.1 (4)
- 4.2.7 (0)
- 4.2.9 (0)
- 5.0.0.1 (29)
- 5.1.7 (0)
- 5.2.3 (33)
- 6.0.0 (9)
- 6.1.3.1 (0)
- 6.1.7.7 (0)
- 7.0.0 (0)
- 7.1.3.2 (0)
- 7.1.3.4 (0)
- What's this?
create_table(name, options = {})
public
Creates a new table There are two ways to work with #create_table. You can use the block form or the regular form, like this:
Block form
# create_table() yields a TableDefinition instance create_table(:suppliers) do |t| t.column :name, :string, :limit => 60 # Other fields here end
Regular form
create_table(:suppliers) add_column(:suppliers, :name, :string, {:limit => 60})
The options hash can include the following keys:
- :id
- Set to true or false to add/not add a primary key column automatically. Defaults to true.
- :primary_key
- The name of the primary key, if one is to be added automatically. Defaults to id.
- :options
- Any extra options you want appended to the table definition.
- :temporary
- Make a temporary table.
- :force
- Set to true or false to drop the table before creating it. Defaults to false.
Examples
Add a backend specific option to the generated SQL (MySQL)
create_table(:suppliers, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8')
generates:
CREATE TABLE suppliers ( id int(11) DEFAULT NULL auto_increment PRIMARY KEY ) ENGINE=InnoDB DEFAULT CHARSET=utf8
Rename the primary key column
create_table(:objects, :primary_key => 'guid') do |t| t.column :name, :string, :limit => 80 end
generates:
CREATE TABLE objects ( guid int(11) DEFAULT NULL auto_increment PRIMARY KEY, name varchar(80) )
Do not add a primary key column
create_table(:categories_suppliers, :id => false) do |t| t.column :category_id, :integer t.column :supplier_id, :integer end
generates:
CREATE TABLE categories_suppliers_join ( category_id int, supplier_id int )
See also TableDefinition#column for details on how to create columns.
All methods
create_table :table do |t|
t.column # adds an ordinary column. Ex: t.column(:name, :string) t.index # adds a new index. t.timestamps t.change # changes the column definition. Ex: t.change(:name, :string, :limit => 80) t.change_default # changes the column default value. t.rename # changes the name of the column. t.references t.belongs_to t.string t.text t.integer t.float t.decimal t.datetime t.timestamp t.time t.date t.binary t.boolean t.remove t.remove_references t.remove_belongs_to t.remove_index t.remove_timestamps end
bad idea.
Just a note, ypetya’s idea of using a before filter to set the primary key wont scale. transactions will eventually step on each other and probably end up with duplicate key ids, unless you have some other method to ensure uniqueness.
You’d be better off using mysql to generate the default integer primary key and have a secondary string “key” field.
An alternate way to have a string ID as a primary key
You can disable automatically created primary key and add it to manually with mysql:
The migration file:
def self.up create_table( :my_special_table, :id => false ) do |t| t.string :id, :limit => 5, :null => :no end execute "ALTER TABLE my_special_table ADD PRIMARY KEY (id)" end
Then in a before_save filter you can generate the primary key for yourself.
Use a transaction and be aware of uniqueness!
available column types
Rails 3.0.9 update for RobinWu’s post
Available column types:
:string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean
Example:
MyClass < ActiveRecord::Migration
def change create_table :myclass do |t| t.string :name t.text :content end
end
facing issue in create table (errno: 150)
I am trying to create table by writing the following code:
create_table :sam_server_user_audit do | t | t.column :user_id, :string, :limit => 100, :null => false t.column :user_type, :string, :limit => 20, :null => false t.column :status, :string, :limit => 20, :null => false t.column :created_at, :datetime, :null => false end
which generates:
CREATE TABLE `sam_server_user_audit` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `user_id` varchar(100) NOT NULL, `user_type` varchar(20) NOT NULL, `status` varchar(20) NOT NULL, `created_at` datetime NOT NULL, FOREIGN KEY (user_id) REFERENCES users (id)) ENGINE=InnoDB CHARACTER SET `utf8`
here It is adding a foreign key user_id automatically.
How can I avoid that?