浅谈MySQL主键




主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为“PRIMARY KEY”,主键不能重复,一个表只能有一个主键。


1、声明主键的方法:


您可以在创建表的时候就为表加上主键,如:


CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name));


也可以更新表结构时为表加上主键,如:


ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);


/*


创建一个qq表,将qq_id设为主键,且没有对其进行NOT NULl约束


*/


create table qq(


qq_id int(10),


nick_name varchar(255) not null,


primary key (qq_id))


/*


插入一条数据,将qq号设为10000(咱也幻想一下),昵称设为"simaopig"


*/


INSERT INTO qq( qq_id, nick_name )


VALUES (


'10000', 'simaopig');


2、示例


主键被认为是NOT NULL和UNIQUE约束最好的结合。如果这些列没有被明确地定义为NOT NULL,MySQL会隐含地定义这些列。


3、主键也是索引:


刚才已经说了,主键其实也是索引,甚至在MySQL的术语里面“键”就等于“索引”,所以“外键”一定要先设为“索引”。所以主键也应该和索引一样,既可以作用于单独的字段,又可以作用于多个字段。


举个简的例子吧,我住3单元,501室,我叫小小子,那么只有3单元501室才能在本小区表里面唯一确定我家。因为2单元,501室住着的可能也是个小小子,所以只有两个字段才能唯一确定我,也就是说可以二者组合作为主键。组合的主键,每个列都会隐含定义NOT NULL约束,且其二者加在一起被定义了UNIQUE 惟一约束。


/*


创建防火墙表,将host 和port组合设为主键,注意我没有将port设NOT NULL约束


*/


create table firewall(


host varchar(11) not null,


port smallint(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');


========


自增长主键及字符集的修改




1、自增长主键


mysql数据库表主键自增长的sql语句


1)不控制主键的起点


create table emb_t_dictBusType


(


emb_c_busTypeID      int not null auto_increment,


emb_c_busTypeEnName  varchar(255) not null,


emb_c_busTypeZhName  varchar(255) not null,


primary key(emb_c_busTypeID) 


)engine=INNODB  default charset=gbk;


2)控制主键的起点


create table emb_t_dictBusType


(


emb_c_busTypeID      int not null auto_increment,


emb_c_busTypeEnName  varchar(255) not null,


emb_c_busTypeZhName  varchar(255) not null,


primary key(emb_c_busTypeID) 


)engine=INNODB auto_increment=1001 default charset=gbk;


========


mysql 主键自增长




mysql数据库表主键自增长的sql语句


1、不控制主键的起点


create table emb_t_dictBusType


(


   emb_c_busTypeID      int not null auto_increment,


   emb_c_busTypeEnName  varchar(255) not null,


   emb_c_busTypeZhName  varchar(255) not null,


   primary key(emb_c_busTypeID)  


)engine=INNODB  default charset=gbk;


2、控制主键的起点


create table emb_t_dictBusType


(


   emb_c_busTypeID      int not null auto_increment,


   emb_c_busTypeEnName  varchar(255) not null,


   emb_c_busTypeZhName  varchar(255) not null,


   primary key(emb_c_busTypeID)  


)engine=INNODB auto_increment=1001 default charset=gbk;


========


MySQL主键删除/添加




修改数据库和表的字符集


alter database maildb default character set utf8;//修改数据库的字符集


alter table mailtable default character set utf8;//修改表的字符集


如果您想要把表默认的字符集和所有字符列(CHAR, VARCHAR, TEXT)改为新的字符集,应使用如下语句:


ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;


警告:前面的操作转换了字符集之间的列类型。如果您有一列使用一种字符集(如latin1),但是存储的值实际上使用了其它的字符集(如utf8),这种情况不是您想要的。此时,您必须对这样的列进行以下操作。


ALTER TABLE t1 CHANGE c1 c1 BLOB;


ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;


这种方法能够实现此功能的原因是,当您转换到BLOB列或从BLOB列转换过来时,并没有发生转换。




mysql的主键问题:


Mysql的两种主键。Primary key 和not null auto_incriment


在建立mysql表时,给一个字段添加了主键primary key 


在insert数据时可以不用insert主键,mysql会自动添加0,但是在第二次insert时没有填写值mysql数据库还是默认添加0,会导致有重复的主键,这是不可以的。所有在定义了primary key时,在insert数据时要给主键填写值。


在建立mysql表时,给一个字段添加了主键not null auto_increment=1;


这也是一个主键。时自增长的以1为开始。这个字段是可以不用填写值的,mysql数据库会自动给填写值,不会出现primary key的状况。


Alter table tb add primary key(id);


Alter table tb change id id int(10) not null auto_increment=1;


4 删除自增长的主键id


先删除自增长在删除主键


Alter table tb change id id int(10);//删除自增长


Alter table tb drop primary key;//删除主建


========


MySQL 主键与索引的联系与区别分析




..关系数据库依赖于主键,它是数据库物理模式的基石。主键在物理层面上只有两个用途: 


惟一地标识一行。 


作为一个可以被外键有效引用的对象。 


索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。下面是主键和索引的一些区别与联系。 




1. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 


所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。数据库在设计时,主键起到了很重要的作用。 




主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。 




2. 一个表中可以有多个唯一性索引,但只能有一个主键。 


3. 主键列不允许空值,而唯一性索引列允许空值。 


4. 索引可以提高查询的速度。 




其实主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是主键不实际存在,而索引实际存在在数据库中,主键一般都要建,主要是用来避免一张表中有相同的记录,索引一般可以不建,但如果需要对该表进行查询操作,则最好建,这样可以加快检索的速度。 




FAQ 




1. 主键是个什么? 


我来来具体的东西说吧,书大家都看过吧,没看过的找本翻一下,看下它每页是不是有个页码,我们的数据表主键就相当于是这个页码,明白了吧。 




2. 那么索引是什么呢? 


我们还拿书来说,索引相当于书的目录,有了目录我们可以很快的知道这本书的基本内容和结构,数据索引也一样,它可以加快数据表的查询速度。 




3. 主键主索引类比,及其他们的作用? 


主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。 


数据表中只允许有一个主键,但是可以有多个索引。 


使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率。 


索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描。 


主键索引外索引的值可以为空。 


主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引。 


唯一索引则表示该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引。


========


MySQL 创建主键,外键和复合主键的语句




..1.创建主键语法 




ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名); 




2.创建外键语法 




ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[约束名] FOREIGN KEY (info_id)[子表列] REFERENCES news_type[主表名] (id)[主表列] ; 




3.使用组合主键 




如果一列不能唯一区分一个表里的记录时,可以考虑多个列组合起来达到区分表记录的唯一性,形式 




1)创建时:create table sc ( 


studentno int, 


courseid int, 


score int, 


primary key (studentno,courseid) ); 


2)修改时:alter table tb_name add primary key (字段1,字段2,字段3); 


========


MYSQL主键与外键的理论知识




键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。


必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。


首先来谈:主键。


关系数据库依赖于主键—它是数据库物理模式的基石。主键在物理层面上只有两个用途:


1. 惟一地标识一行。


2. 作为一个可以被外键有效引用的对象。


基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:


1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。


2. 主键应该是单列的,以便提高连接和筛选操作的效率。


注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数 据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键, 即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表 主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。


3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。


注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。


4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。


5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。


外键是用来和其他表建立联系用的:这个表中的一列和另外一个表中的一列相同,为了让这两个表联系起来,就把其中一个表中的列设成外键,把另外一个表列设成主键,就实现了这两个表的关联。


ps:一个表可以有多个外键。但主键只能有一个。


更多关于MySQL主键和外键:


主键:


能够唯一表示数据表中的每个记录的【字段】或者【字段】的组合就称为主码(主键)。 一个主键是唯一识别一个表的每一记录,但这只是其作用的一部分,主键的主要作用是将记录和存放在其他表中的数据进行关联。在这一点上,主键是不同表中各记 录之间的简单指针。主键约束就是确定表中的每一条记录。主键不能是空值。唯一约束是用于指定一个或多个列的组合值具有惟一性,以防止在列中输入重复的值。 所以,主键的值对用户而言是没有什么意义,并且和它要赋予的值也没有什么特别的联系。


外键:


若有两个表A,B,C是A的主键,而B中也有C字段,则C就是表B的外键。外键约束主要用来维护两个表之间数据的一致性。


A为基本表,B为信息表!


========