CREATE TABLE

Description

Create a new table.

Syntax

  1. > CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]table_name [comment = "comment of table"];
  2. (
  3. name1 type1 [comment 'comment of column'] [AUTO_INCREMENT] [[PRIMARY] KEY] [[FOREIGN] KEY],
  4. name2 type2 [comment 'comment of column'],
  5. ...
  6. )
  7. [cluster by (column_name1, column_name2, ...);]
  8. [partition_options]

Explanations

Temporary Tables

You can use the TEMPORARY keyword when creating a table. A TEMPORARY table is visible only within the current session, and is dropped automatically when the session is closed. This means that two different sessions can use the same temporary table name without conflicting with each other or with an existing non-TEMPORARY table of the same name. (The existing table is hidden until the temporary table is dropped.)

Dropping a database does automatically drop any TEMPORARY tables created within that database.

The creating session can perform any operation on the table, such as DROP TABLE, INSERT, UPDATE, or SELECT.

COMMENT

A comment for a column or a table can be specified with the COMMENT option.

  • Up to 1024 characters long. The comment is displayed by the SHOW CREATE TABLE and SHOW FULL COLUMNS statements. It is also shown in the COLUMN_COMMENT column of the INFORMATION_SCHEMA.COLUMNS table.

AUTO_INCREMENT

The initial AUTO_INCREMENT value for the table.

An integer column can have the additional attribute AUTO_INCREMENT. When you insert a value of NULL (recommended) or 0 into an indexed AUTO_INCREMENT column, the column is set to the next sequence value. Typically this is value+1, where value is the largest value for the column currently in the table. AUTO_INCREMENT sequences begin with 1.

There can be only one AUTO_INCREMENT column per table, it must be indexed, and it cannot have a DEFAULT value. An AUTO_INCREMENT column works properly only if it contains only positive values. Inserting a negative number is regarded as inserting a very large positive number. This is done to avoid precision problems when numbers “wrap” over from positive to negative and also to ensure that you do not accidentally get an AUTO_INCREMENT column that contains 0.

PRIMARY KEY

The PRIMARY KEY constraint uniquely identifies each record in a table.

Primary keys must contain UNIQUE values, and cannot contain NULL values.

A table can have only ONE primary key; and in the table, this primary key can consist of single column (field).

  • SQL PRIMARY KEY on CREATE TABLE

The following SQL creates a PRIMARY KEY on the “ID” column when the “Persons” table is created:

  1. > CREATE TABLE Persons (
  2. ID int NOT NULL,
  3. LastName varchar(255) NOT NULL,
  4. FirstName varchar(255),
  5. Age int,
  6. PRIMARY KEY (ID)
  7. );

FOREIGN KEY

The FOREIGN KEY constraint is used to prevent actions that would destroy links between tables.

A FOREIGN KEY is a field (or collection of fields) in one table, that refers to the PRIMARY KEY in another table.

The table with the foreign key is called the child table, and the table with the primary key is called the referenced or parent table.

The FOREIGN KEY constraint prevents invalid data from being inserted into the foreign key column, because it has to be one of the values contained in the parent table.

When defining FOREIGN KEY, the following rules need to be followed:

  • The parent table must already exist in the database or be a table currently being created. In the latter case, the parent table and the slave table are the same table, such a table is called a self-referential table, and this structure is called self-referential integrity.

  • A primary key must be defined for the parent table.

  • Specify the column name or combination of column names after the table name of the parent table. This column or combination of columns must be the primary or candidate key of the primary table.

  • The number of columns in the foreign key must be the same as the number of columns in the primary key of the parent table.

  • The data type of the column in the foreign key must be the same as the data type of the corresponding column in the primary key of the parent table.

The following is an example to illustrate the association of parent and child tables through FOREIGN KEY and PRIMARY KEY:

First, create a parent table with field a as the primary key:

  1. create table t1(a int primary key,b varchar(5));
  2. insert into t1 values(101,'abc'),(102,'def');
  3. mysql> select * from t1;
  4. +------+------+
  5. | a | b |
  6. +------+------+
  7. | 101 | abc |
  8. | 102 | def |
  9. +------+------+
  10. 2 rows in set (0.00 sec)

Then create a child table with field c as the foreign key, associated with parent table field a:

  1. create table t2(a int ,b varchar(5),c int, foreign key(c) references t1(a));
  2. insert into t2 values(1,'zs1',101),(2,'zs2',102);
  3. insert into t2 values(3,'xyz',null);
  4. mysql> select * from t2;
  5. +------+------+------+
  6. | a | b | c |
  7. +------+------+------+
  8. | 1 | zs1 | 101 |
  9. | 2 | zs2 | 102 |
  10. | 3 | xyz | NULL |
  11. +------+------+------+
  12. 3 rows in set (0.00 sec)

For more information on data integrity constraints, see Data Integrity Constraints Overview.

Cluster by

Cluster by is a command used to optimize the physical arrangement of a table. When creating a table, the Cluster by command can physically sort the table based on a specified column for tables without a primary key. It will rearrange the data rows to match the order of values in that column. Using Cluster by improves query performance.

  • The syntax for a single column is: create table() cluster by col;
  • The syntax for multiple columns is: create table() cluster by (col1, col2);

Note: Cluster by cannot coexist with a primary key, or a syntax error will occur. Cluster by can only be specified when creating a table and does not support dynamic creation.

For more information on using Cluster by for performing tuning, see Using Cluster by for performance tuning.

Table PARTITION and PARTITIONS

  1. partition_options:
  2. PARTITION BY
  3. { [LINEAR] HASH(expr)
  4. | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
  5. [PARTITIONS num]
  6. [(partition_definition [, partition_definition] ...)]
  7. partition_definition:
  8. PARTITION partition_name
  9. [VALUES
  10. {LESS THAN {(expr | value_list) | MAXVALUE}
  11. |
  12. IN (value_list)}]
  13. [COMMENT [=] 'string' ]

Partitions can be modified, merged, added to tables, and dropped from tables.

  • PARTITION BY

If used, a partition_options clause begins with PARTITION BY. This clause contains the function that is used to determine the partition; the function returns an integer value ranging from 1 to num, where num is the number of partitions.

  • HASH(expr)

Hashes one or more columns to create a key for placing and locating rows. expr is an expression using one or more table columns. For example, these are both valid CREATE TABLE statements using PARTITION BY HASH:

  1. CREATE TABLE t1 (col1 INT, col2 CHAR(5))
  2. PARTITION BY HASH(col1);
  3. CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME)
  4. PARTITION BY HASH ( YEAR(col3) );
  • KEY(column_list)

This is similar to HASH. The column_list argument is simply a list of 1 or more table columns (maximum: 16). This example shows a simple table partitioned by key, with 4 partitions:

  1. CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
  2. PARTITION BY KEY(col3)
  3. PARTITIONS 4;

For tables that are partitioned by key, you can employ linear partitioning by using the LINEAR keyword. This has the same effect as with tables that are partitioned by HASH. This example uses linear partitioning by key to distribute data between 5 partitions:

  1. CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
  2. PARTITION BY LINEAR KEY(col3)
  3. PARTITIONS 5;
  • RANGE(expr)

In this case, expr shows a range of values using a set of VALUES LESS THAN operators. When using range partitioning, you must define at least one partition using VALUES LESS THAN. You cannot use VALUES IN with range partitioning.

PARTITION ... VALUES LESS THAN ... statements work in a consecutive fashion. VALUES LESS THAN MAXVALUE works to specify “leftover” values that are greater than the maximum value otherwise specified.

The clauses must be arranged in such a way that the upper limit specified in each successive VALUES LESS THAN is greater than that of the previous one, with the one referencing MAXVALUE coming last of all in the list.

  • PARTITIONS num

The number of partitions may optionally be specified with a PARTITIONS num clause, where num is the number of partitions. If both this clause and any PARTITION clauses are used, num must be equal to the total number of any partitions that are declared using PARTITION clauses.

Examples

  • Example 1: Create a common table
  1. CREATE TABLE test(a int, b varchar(10));
  2. INSERT INTO test values(123, 'abc');
  3. mysql> SELECT * FROM test;
  4. +------+---------+
  5. | a | b |
  6. +------+---------+
  7. | 123 | abc |
  8. +------+---------+
  • Example 2: Add comments when creating a table
  1. create table t2 (a int, b int) comment = "fact table";
  2. mysql> show create table t2;
  3. +-------+---------------------------------------------------------------------------------------+
  4. | Table | Create Table |
  5. +-------+---------------------------------------------------------------------------------------+
  6. | t2 | CREATE TABLE `t2` (
  7. `a` INT DEFAULT NULL,
  8. `b` INT DEFAULT NULL
  9. ) COMMENT='fact table', |
  10. +-------+---------------------------------------------------------------------------------------+
  • Example 3: Add comments to columns when creating tables
  1. create table t3 (a int comment 'Column comment', b int) comment = "table";
  2. mysql> SHOW CREATE TABLE t3;
  3. +-------+----------------------------------------------------------------------------------------------------------+
  4. | Table | Create Table |
  5. +-------+----------------------------------------------------------------------------------------------------------+
  6. | t3 | CREATE TABLE `t3` (
  7. `a` INT DEFAULT NULL COMMENT 'Column comment',
  8. `b` INT DEFAULT NULL
  9. ) COMMENT='table', |
  10. +-------+----------------------------------------------------------------------------------------------------------+
  • Example 4: Create a common partitioned table
  1. CREATE TABLE tp1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY KEY(col3) PARTITIONS 4;
  2. mysql> SHOW CREATE TABLE tp1;
  3. +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
  4. | Table | Create Table |
  5. +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
  6. | tp1 | CREATE TABLE `tp1` (
  7. `col1` INT DEFAULT NULL,
  8. `col2` CHAR(5) DEFAULT NULL,
  9. `col3` DATE DEFAULT NULL
  10. ) partition by key algorithm = 2 (col3) partitions 4 |
  11. +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
  12. 1 row in set (0.00 sec)
  13. -- do not specify the number of partitions
  14. CREATE TABLE tp2 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY KEY(col3);
  15. mysql> SHOW CREATE TABLE tp2;
  16. +-------+---------------------------------------------------------------------------------------------------------------------------------------------+
  17. | Table | Create Table |
  18. +-------+---------------------------------------------------------------------------------------------------------------------------------------------+
  19. | tp2 | CREATE TABLE `tp2` (
  20. `col1` INT DEFAULT NULL,
  21. `col2` CHAR(5) DEFAULT NULL,
  22. `col3` DATE DEFAULT NULL
  23. ) partition by key algorithm = 2 (col3) |
  24. +-------+---------------------------------------------------------------------------------------------------------------------------------------------+
  25. 1 row in set (0.00 sec)
  26. -- Specify partition algorithm
  27. CREATE TABLE tp3
  28. (
  29. col1 INT,
  30. col2 CHAR(5),
  31. col3 DATE
  32. ) PARTITION BY KEY ALGORITHM = 1 (col3);
  33. mysql> show create table tp3;
  34. +-------+---------------------------------------------------------------------------------------------------------------------------------------------+
  35. | Table | Create Table |
  36. +-------+---------------------------------------------------------------------------------------------------------------------------------------------+
  37. | tp3 | CREATE TABLE `tp3` (
  38. `col1` INT DEFAULT NULL,
  39. `col2` CHAR(5) DEFAULT NULL,
  40. `col3` DATE DEFAULT NULL
  41. ) partition by key algorithm = 1 (col3) |
  42. +-------+---------------------------------------------------------------------------------------------------------------------------------------------+
  43. 1 row in set (0.00 sec)
  44. -- Specify partition algorithm and the number of partitions
  45. CREATE TABLE tp4 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR KEY ALGORITHM = 1 (col3) PARTITIONS 5;
  46. mysql> SHOW CREATE TABLE tp4;
  47. +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
  48. | Table | Create Table |
  49. +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
  50. | tp4 | CREATE TABLE `tp4` (
  51. `col1` INT DEFAULT NULL,
  52. `col2` CHAR(5) DEFAULT NULL,
  53. `col3` DATE DEFAULT NULL
  54. ) partition by linear key algorithm = 1 (col3) partitions 5 |
  55. +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
  56. 1 row in set (0.01 sec)
  57. -- Multi-column partition
  58. CREATE TABLE tp5
  59. (
  60. col1 INT,
  61. col2 CHAR(5),
  62. col3 DATE
  63. ) PARTITION BY KEY(col1, col2) PARTITIONS 4;
  64. mysql> SHOW CREATE TABLE tp5;
  65. +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
  66. | Table | Create Table |
  67. +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
  68. | tp5 | CREATE TABLE `tp5` (
  69. `col1` INT DEFAULT NULL,
  70. `col2` CHAR(5) DEFAULT NULL,
  71. `col3` DATE DEFAULT NULL
  72. ) partition by key algorithm = 2 (col1, col2) partitions 4 |
  73. +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
  74. 1 row in set (0.01 sec)
  75. -- Create a primary key column partition
  76. CREATE TABLE tp6
  77. (
  78. col1 INT NOT NULL PRIMARY KEY,
  79. col2 DATE NOT NULL,
  80. col3 INT NOT NULL,
  81. col4 INT NOT NULL
  82. ) PARTITION BY KEY(col1) PARTITIONS 4;
  83. mysql> SHOW CREATE TABLE tp6;
  84. +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  85. | Table | Create Table |
  86. +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  87. | tp6 | CREATE TABLE `tp6` (
  88. `col1` INT NOT NULL,
  89. `col2` DATE NOT NULL,
  90. `col3` INT NOT NULL,
  91. `col4` INT NOT NULL,
  92. PRIMARY KEY (`col1`)
  93. ) partition by key algorithm = 2 (col1) partitions 4 |
  94. +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  95. 1 row in set (0.01 sec)
  96. -- Create HASH partition
  97. CREATE TABLE tp7
  98. (
  99. col1 INT,
  100. col2 CHAR(5)
  101. ) PARTITION BY HASH(col1);
  102. mysql> SHOW CREATE TABLE tp7;
  103. +-------+------------------------------------------------------------------------------------------------------+
  104. | Table | Create Table |
  105. +-------+------------------------------------------------------------------------------------------------------+
  106. | tp7 | CREATE TABLE `tp7` (
  107. `col1` INT DEFAULT NULL,
  108. `col2` CHAR(5) DEFAULT NULL
  109. ) partition by hash (col1) |
  110. +-------+------------------------------------------------------------------------------------------------------+
  111. 1 row in set (0.01 sec)
  112. -- Specifies the number of HASH partitions when creating hash partition
  113. CREATE TABLE tp8
  114. (
  115. col1 INT,
  116. col2 CHAR(5)
  117. ) PARTITION BY HASH(col1) PARTITIONS 4;
  118. mysql> SHOW CREATE TABLE tp8;
  119. +-------+-------------------------------------------------------------------------------------------------------------------+
  120. | Table | Create Table |
  121. +-------+-------------------------------------------------------------------------------------------------------------------+
  122. | tp8 | CREATE TABLE `tp8` (
  123. `col1` INT DEFAULT NULL,
  124. `col2` CHAR(5) DEFAULT NULL
  125. ) partition by hash (col1) partitions 4 |
  126. +-------+-------------------------------------------------------------------------------------------------------------------+
  127. 1 row in set (0.00 sec)
  128. -- specify the partition granularity when creating a partition
  129. CREATE TABLE tp9
  130. (
  131. col1 INT,
  132. col2 CHAR(5),
  133. col3 DATETIME
  134. ) PARTITION BY HASH (YEAR(col3));
  135. mysql> SHOW CREATE TABLE tp9;
  136. +-------+------------------------------------------------------------------------------------------------------------------------------------------+
  137. | Table | Create Table |
  138. +-------+------------------------------------------------------------------------------------------------------------------------------------------+
  139. | tp9 | CREATE TABLE `tp9` (
  140. `col1` INT DEFAULT NULL,
  141. `col2` CHAR(5) DEFAULT NULL,
  142. `col3` DATETIME DEFAULT NULL
  143. ) partition by hash (year(col3)) |
  144. +-------+------------------------------------------------------------------------------------------------------------------------------------------+
  145. 1 row in set (0.00 sec)
  146. -- specify the partition granularity and number of partitions when creating a partition
  147. CREATE TABLE tp10
  148. (
  149. col1 INT,
  150. col2 CHAR(5),
  151. col3 DATE
  152. ) PARTITION BY LINEAR HASH( YEAR(col3)) PARTITIONS 6;
  153. mysql> SHOW CREATE TABLE tp10;
  154. +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
  155. | Table | Create Table |
  156. +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
  157. | tp10 | CREATE TABLE `tp10` (
  158. `col1` INT DEFAULT NULL,
  159. `col2` CHAR(5) DEFAULT NULL,
  160. `col3` DATE DEFAULT NULL
  161. ) partition by linear hash (year(col3)) partitions 6 |
  162. +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
  163. 1 row in set (0.00 sec)
  164. -- Use the primary key column as the HASH partition when creating a partition
  165. CREATE TABLE tp12 (col1 INT NOT NULL PRIMARY KEY, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL) PARTITION BY HASH(col1) PARTITIONS 4;
  166. mysql> SHOW CREATE TABLE tp12;
  167. +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  168. | Table | Create Table |
  169. +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  170. | tp12 | CREATE TABLE `tp12` (
  171. `col1` INT NOT NULL,
  172. `col2` DATE NOT NULL,
  173. `col3` INT NOT NULL,
  174. `col4` INT NOT NULL,
  175. PRIMARY KEY (`col1`)
  176. ) partition by hash (col1) partitions 4 |
  177. +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  178. 1 row in set (0.01 sec)
  • Example 5: Primary key auto increment
  1. drop table if exists t1;
  2. create table t1(a bigint primary key auto_increment,
  3. b varchar(10));
  4. insert into t1(b) values ('bbb');
  5. insert into t1 values (3, 'ccc');
  6. insert into t1(b) values ('bbb1111');
  7. mysql> select * from t1 order by a;
  8. +------+---------+
  9. | a | b |
  10. +------+---------+
  11. | 1 | bbb |
  12. | 3 | ccc |
  13. | 4 | bbb1111 |
  14. +------+---------+
  15. 3 rows in set (0.01 sec)
  16. insert into t1 values (2, 'aaaa1111');
  17. mysql> select * from t1 order by a;
  18. +------+----------+
  19. | a | b |
  20. +------+----------+
  21. | 1 | bbb |
  22. | 2 | aaaa1111 |
  23. | 3 | ccc |
  24. | 4 | bbb1111 |
  25. +------+----------+
  26. 4 rows in set (0.00 sec)
  27. insert into t1(b) values ('aaaa1111');
  28. mysql> select * from t1 order by a;
  29. +------+----------+
  30. | a | b |
  31. +------+----------+
  32. | 1 | bbb |
  33. | 2 | aaaa1111 |
  34. | 3 | ccc |
  35. | 4 | bbb1111 |
  36. | 5 | aaaa1111 |
  37. +------+----------+
  38. 5 rows in set (0.01 sec)
  39. insert into t1 values (100, 'xxxx');
  40. insert into t1(b) values ('xxxx');
  41. mysql> select * from t1 order by a;
  42. +------+----------+
  43. | a | b |
  44. +------+----------+
  45. | 1 | bbb |
  46. | 2 | aaaa1111 |
  47. | 3 | ccc |
  48. | 4 | bbb1111 |
  49. | 5 | aaaa1111 |
  50. | 100 | xxxx |
  51. | 101 | xxxx |
  52. +------+----------+
  53. 7 rows in set (0.00 sec)

Constraints

Currently, it is not supported to use the ALTER TABLE table_name DROP PRIMARY KEY statement to drop the primary key from a table.