sql >> Databasteknik >  >> RDS >> Mysql

Finns det ett sätt i MySQL att implicit skapa en primärnyckel för en tabell?

Nej, PRIMÄRNYCKLEN måste definieras i tabellen.

Du kanske funderar på detta , som gäller för InnoDB-motorn:

Nedan är ett exempel som visar hur indexet skapades för en tabell utan PRIMÄRNYCKEL och ingen UNIK kolumn.

# Create the table
create table test.check_table (id int, description varchar(10)) ENGINE = INNODB;

# Verify that there is no primary or unique column
desc test.check_table;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id          | int(11)     | YES  |     | NULL    |       |
| description | varchar(10) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+


# Insert some values
insert into test.check_table values(1, 'value-1');
insert into test.check_table values(2, 'value-2');
insert into test.check_table values(null, 'value-3');
insert into test.check_table values(4, null);
insert into test.check_table values(1, 'value-1');


# Verify table
select * from test.check_table;
+------+-------------+
| id   | description |
+------+-------------+
|    1 | value-1     |
|    2 | value-2     |
| NULL | value-3     |
|    4 | NULL        |
|    1 | value-1     |
+------+-------------+


# Verify that the GEN_CLUST_INDEX index is auto-created.
select * from INFORMATION_SCHEMA.INNODB_INDEX_STATS where TABLE_SCHEMA='test' and TABLE_NAME = 'check_table';
+--------------+-------------+-----------------+--------+--------------+-------------------+------------------+
| table_schema | table_name  | index_name      | fields | rows_per_key | index_total_pages | index_leaf_pages |
+--------------+-------------+-----------------+--------+--------------+-------------------+------------------+
| test         | check_table | GEN_CLUST_INDEX |      1 | 5            |                 1 |                1 |
+--------------+-------------+-----------------+--------+--------------+-------------------+------------------+

# Duplicate rows are still allowed (Primary Key constraints not enforced)

insert into test.check_table values(1, 'value-1');

select * from test.check_table;
+------+-------------+
| id   | description |
+------+-------------+
|    1 | value-1     |
|    2 | value-2     |
| NULL | value-3     |
|    4 | NULL        |
|    1 | value-1     |
|    5 | value-5     |
|    1 | value-1     |
+------+-------------+

Som kontrast skapar en tabell med en specificerad PRIMARY KEY ett index med namnet PRIMARY.

# Create another table
create table test.check_table_2 (id int, description varchar(10), PRIMARY KEY(id)) ENGINE = INNODB;

# Verify primary key column
desc check_table_2;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id          | int(11)     | NO   | PRI | 0       |       |
| description | varchar(10) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+

# Verify index
select * from INFORMATION_SCHEMA.INNODB_INDEX_STATS where TABLE_SCHEMA='test' and TABLE_NAME = 'check_table_2';
+--------------+---------------+------------+--------+--------------+-------------------+------------------+
| table_schema | table_name    | index_name | fields | rows_per_key | index_total_pages | index_leaf_pages |
+--------------+---------------+------------+--------+--------------+-------------------+------------------+
| test         | check_table_2 | PRIMARY    |      1 | 0            |                 1 |                1 |
+--------------+---------------+------------+--------+--------------+-------------------+------------------+

# Primary key is enforced
insert into check_table_2 values(1,'value-1');
OK

insert into check_table_2 values(1,'value-1');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'



  1. Cachedata i PHP SESSION, eller fråga från db varje gång?

  2. Sorterar MySQL-fråga efter latitud/longitud

  3. Varför får jag System.Data.DataRowView istället för riktiga värden i min Listbox?

  4. Mysql 1 slumpmässig rad