1、声明主键的方法:您可以在创建表的时候就为表加上主键,如:
CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name));
也可以更新表结构时为表加上主键,如:
?ALTER TABLE tbl_nameADD PRIMARY KEY (index_col_name,…);/*创建一个qq表,将qq_id设为主键,且没有对其进行NOT NULl约束*/create table qq(qq_idint(10),nick_namevarchar(255)not null,primary key (qq_id))/*插入一条数据,将qq号设为10000(咱也幻想一下),昵称设为"simaopig"*/INSERT INTO qq( qq_id, nick_name )VALUES ('10000','simaopig');
主键被认为是NOT NULL和UNIQUE约束最好的结合。如果这些列没有被明确地定义为NOT NULL,MySQL会隐含地定义这些列。
2、主键也是索引:刚才已经说了,主键其实也是索引,甚至在MySQL的术语里面“键”就等于“索引”,所以“外键”一定要先设为“索引”。所以主键也应该和索引一样,既可以作用于单独的字段,又可以作用于多个字段。
举个简的例子吧,我住3单元,501室,我叫小小子,那么只有3单元501室才能在本小区表里面唯一确定我家。因为2单元,501室住着的可能也是个小小子,所以只有两个字段才能唯一确定我,也就是说可以二者组合作为主键。组合的主键,每个列都会隐含定义NOT NULL约束,且其二者加在一起被定义了UNIQUE 惟一约束。
?/*创建防火墙表,将host 和port组合设为主键,注意我没有将port设NOT NULL约束*/create table firewall(hostvarchar(11)not null,portsmallint(4),access enum('deny','allow')not null,primary key (host,port))/*插入一条新的记录,没有啥问题1 row(s) inserted.*/INSERT INTO firewall (host ,port ,access)VALUES ('202.65.3.87','21','deny');
3、设置主键自增下面我们通过一个实例来讲解设置主键自增的方法:
首先创建数据库,创建表
?1mysql> create database ssh2;
?1Query OK, 1 row affected (0.04 sec)
?1mysql> use ssh2;
?1Database changed
?123456mysql>create table user(-> idinteger primary key,-> firstnamevarchar(200)not null,-> lastnamevarchar(200)not null,-> ageinteger-> );
?1Query OK, 0 rows affected (0.46 sec)
给主键增加一个自增的功能:
?1mysql>alter table user modify idinteger auto_increment ;
?12Query OK, 1 row affected (0.28 sec)Records: 1 Duplicates: 0 Warnings: 0
这样,上面的user表里面的主键,id可以自增了。
给上面的主键id增加默认值和自增功能。
?1mysql>alter table user modify idinteger auto_increment ;
?12Query OK, 0 rows affected (0.39 sec)Records: 0 Duplicates: 0 Warnings: 0
?1mysql>alter table user modify idinteger default '1';
?12Query OK, 0 rows affected (0.16 sec)Records: 0 Duplicates: 0 Warnings: 0
?1mysql>alter table user modify idinteger auto_increment ;
?12Query OK, 1 row affected (0.28 sec)Records: 1 Duplicates: 0 Warnings: 0
MySql获取系统时间:
?1mysql>alter table user add createtimetimestamp default current_timestamp;
?12Query OK, 2 rows affected (0.17 sec)Records: 2 Duplicates: 0 Warnings: 0
MySql设置主键不能为空,还要自动增长(这里没有设置默认值,但是默认是1,从1开始增长。),还要得到系统默认日期:
?12345mysql>create table dd(-> idint primary key not null auto_increment,->name varchar(20),->time timestamp default current_timestamp-> );
?1Query OK, 0 rows affected (0.10 sec)
?1mysql>insert into dd(name)values ('fhihgifds');
?1Query OK, 1 row affected (0.14 sec)
?1mysql>insert into dd(name)values ('steven');
?1Query OK, 1 row affected (0.08 sec)
?1mysql>select *from dd;
?1234567+----+-----------+---------------------+| id | name | time |+----+-----------+---------------------+| 1 | fhihgifds | 2011-03-27 01:58:46 || 2 | steven | 2011-03-27 01:59:35 |+----+-----------+---------------------+2 rows in set (0.08 sec)
?1mysql>insert into dd(name)values ('anthony');
?1Query OK, 1 row affected (0.09 sec)
?1mysql>select *from dd;
?+----+-----------+---------------------+| id | name | time |+----+-----------+---------------------+| 1 | fhihgifds | 2011-03-27 01:58:46 || 2 | steven | 2011-03-27 01:59:35 || 3 | anthony | 2011-03-27 02:00:07 |+----+-----------+---------------------+3 rows in set (0.00 sec)