MySQL—‘PRIMARY KEY’的使用

一、定义:

主键(PRIMARY KEY),又称主码,是表中一列或多列的组合。
MySQL主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行
这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。

二、选取设置主键约束的字段:

主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符;
主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键

规则:

1.每个表只能定义一个主键
2.唯一性原则(主键值必须唯一标识表中的每一行,且不能为NULL,即表中不可能存在两行数据有相同的主键值)
3.一个列名只能在复合主键列表中出现一次
4.最小化原则(复合主键不能包含不必要的多余列;当把复合主键的某一列删除后,如果剩下的列构成的主键仍然满足唯 一性原则,那么这个复合主键是不正确的)

三、主键的类型:单字段主键和多字段联合主键.

1.单字段主键
(1) 在创建表时设置主键约束,语法规则:

字段名 数据类型 PRIMARY KEY [默认值];

实例1:在test_db数据库中创建 tb_emp1数据表,其主键为id,SQL语句如下

mysql> create table tb_emp1
    -> (
    -> id int(11) primary key,
    -> name varchar(25),
    -> deptid int(11),
    -> salary float
    -> );
Query OK, 0 rows affected (0.01 sec)

(2) 在定义完所有列之后指定主键,语法规则:

 [CONSTRAINT <约束名>] PRIMARY KEY [字段名];

实例2:创建tb_emp2数据表,其主键为id,SQL语句如下

mysql> create table tb_emp2
    -> (
    -> id int(11),
    -> name varchar(25),
    -> deptid int(11),
    -> salary float,
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.01 sec)
mysql> show create table tb_emp2G;
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(25) DEFAULT NULL,
  `deptid` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)

2.多字段联合主键:
语法规则:

PRIMARY KEY [字段1,字段2,……,字段n];

实例3:创建数据表tb_emp3,假设表中没有主键id,为了唯一确定一个员工,可以把name、deptid联合起来作为主键,SQL语句如下

mysql> create table tb_emp3
    -> (
    -> name varchar(25),
    -> deptid int(11),
    -> salary float,
    -> primary key(name,deptid)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> show create table tb_emp3G;
*************************** 1. row ***************************
       Table: tb_emp3
Create Table: CREATE TABLE `tb_emp3` (
  `name` varchar(25) NOT NULL DEFAULT '',
  `deptid` int(11) NOT NULL DEFAULT '0',
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`name`,`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)

3.在修改表时添加主键约束
语法规则:

ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>);

实例4:查看tb_emp2数据表的表结构

mysql> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   |     | 0       |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

修改数据表tb_emp2,将字段id设置为主键,SQL语句如下:

mysql> alter table tb_emp2 add primary key(id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | 0       |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

4.删除主键约束

ALTER TABLE <数据表名> DROP PRIMARY KEY;

因为每个表的主键约束只有一个,所以并不用指定名称。
实例5:删除tb_emp2表的主键约束

mysql> alter table tb_emp2 drop primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   |     | 0       |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

作者:ccku
出处:http://www.cnblogs.com/ccku/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。