如何在MySQL表创建中了解PRIMARY KEY和'('之间的名称?

时间:2019-01-14 09:25:57

标签: mysql

如何在MySQL中这样理解句子中的名称“ test_id”?

CREATE TABLE test(id INT, PRIMARY KEY test_id(id));

在学习MySQL的时候,我碰巧读了这样的一条语句:

CREATE TABLE test(id INT, PRIMARY KEY test_id(id));

在我的MACOS 10.14 mysql@5.7外壳程序中,我试图省略'test_id'来创建表,而我使用的是'DESC test;'。语句,发现我创建的两个表之间没有区别。

  1. 带有“ test_id”的声明:
mysql> CREATE TABLE test(id INT, PRIMARY KEY test_id(id));
Query OK, 0 rows affected (0.01 sec)

mysql> DESC test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)
  1. 不含“ test_id”的声明:
mysql> CREATE TABLE test2(id INT, PRIMARY KEY (id));
Query OK, 0 rows affected (0.01 sec)

mysql> DESC test2;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

2 个答案:

答案 0 :(得分:3)

documentation说的是:

  

PRIMARY KEY的名称始终为PRIMARY

基本上,MySQL会接受名称(因为它想成为一个好名字),然后默默地将其丢弃(因为您毕竟无法设置自己的名称)。最好再看看其他示例:

mysql> CREATE TABLE test(id INT, foo INT, PRIMARY KEY this_is_ignored (id), KEY this_is_kept (foo));
Query OK, 0 rows affected (0.02 sec)

mysql> show keys from test;
+-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| test  |          0 | PRIMARY      |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| test  |          1 | this_is_kept |            1 | foo         | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

Fiddle)。

答案 1 :(得分:1)

两个语句都执行相同的工作。他们正在创建表。但是在第一个SQL

CREATE TABLE test(id INT, PRIMARY KEY test_id(id))

它将创建一个名为test的表,并为主键约束指定一个名称“ test_id”。

如果是第二个SQL

CREATE TABLE test2(id INT, PRIMARY KEY (id))

它将创建一个名为test的表,并为主键约束生成一个随机名称。

使用以下查询并检查使用两个表创建的约束

SHOW CREATE TABLE test;