设置MySQL数据表主键

 

设置MySQL数据表主键:

    使用“primary key”关键字创建主键数据列。被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合。如下SQL语句所示:

<pre>

  1. Mysql>create table books(bookid int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,bookname varchar(50)); 
  2. Mysql>insert into books(bookname) values(“book1”),(“book2”),(“book3”); 
  3. Mysql>select * from books; 

</pre>


    若要修改列主键或类型,请参考 ALTER TABLE 语句。
设置MySQL数据表外键

    外键是设置当前表中的某一列与别一数据表中的主键列关联。主要目的是控制与外键表中的数据,保持数据一致性,完整性,也就是说:当前表中这一列的数据必须是关联外键列中的某一数据,而且相关联的两个数据列的类型必须相同;当关联外键列某一数据修改或删除时,将触当前表的某一项相应操作。可解发以下事件以及参数:
触发事件:on delete和on update
可设参数:cascade(跟随外键改动);
restrict(限制外表中的外键改动);
set Null(设空值);
set Default(设默认值);
no action [默认]

    设置关联的语句由[指定主键关键字:foreign key(列名)]和[引用外键关键字: references <外键表名>(外键列名)]组成。例如创建一个关于books的购物车数据表“gbooks”,其中“gbookid”与books表中的“bookid”创建外键关联。

<pre>

  1. Mysql>create table gbooks(gid int(11) not null auto_increment primary key,gbookid int(11),goodsum int(4),foreign key(gbookid) references books(bookid) on delete cascade on update cascade); 

</pre>


    删除外键:

    首先,使用SHOW CREATE TABLE语句查看创建表描述。其中“CONSTRAINT”关键字后面有一个引号括起来的名称,它就是这个表外键的代表,是在创建外键时自动生成的名称,当然在创建的过程中可以直接用“CONSTRAINT”关键字自定义名称。其查看的完整语句如下:

<pre>

  1. Mysql>show create table gbooks; 

</pre>

    这里代表外键的名称是“gbooks_ibfk_1”,目标找到了,再使用ALTER语句进行删除。

<pre>

  1. Mysql>ALTER TABLE gbooks DROP FOREIGN KEY gbooks_ibfk_1; 

</pre>


主键和外键的设置意义:

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

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

主键:

关系数据库依赖于主键—它是数据库物理模式的基石。主键在物理层面上只有两个用途:
1. 惟一地标识一行。
2. 作为一个可以被外键有效引用的对象。

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

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

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

3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。
注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。

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

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

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

MySQL 中,对于包含千万级数据的,使用自增主键(`AUTO_INCREMENT`)是一种常见且高效的策略。自增主键具有以下优势: - **唯一性**:确保每条记录都有唯一的标识符。 - **顺序性**:新插入的数据通常按顺序排列,有利于 B+ 树索引的性能优化。 - **自动管理**:MySQL 自动维护自增字段的值,无需手动干预。 ### 设置自增主键的方式 在创建时,可以通过 `AUTO_INCREMENT` 属性来定义自增主键。例如: ```sql CREATE TABLE large_table ( id INT AUTO_INCREMENT PRIMARY KEY, other_column VARCHAR(255) ) ENGINE=InnoDB; ``` 如果已有但未设置自增主键,可以使用 `ALTER TABLE` 添加自增主键: ```sql ALTER TABLE existing_table ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY; ``` 需要注意的是,在已有数据的中添加自增主键时,MySQL 会为每一行生成一个唯一的自增值,从当前最大值开始递增 [^2]。 ### 性能优化建议 当数据量达到千万级别时,仅依靠自增主键可能不足以保证查询性能,尤其是在频繁进行范围查询或分区操作的情况下。可以考虑以下优化手段: #### 1. **复合主键与分区结合** 若数据存在时间维度上的访问热点(如拨号记录),可将时间字段与自增主键组合成复合主键,并基于时间字段进行分区。这种方式有助于提升按时间范围查询的效率 [^1]。 示例: ```sql CREATE TABLE call_records ( id INT AUTO_INCREMENT, call_time DATETIME NOT NULL, PRIMARY KEY (id, call_time) ) PARTITION BY RANGE (TO_DAYS(call_time)) ( PARTITION p0 VALUES LESS THAN (TO_DAYS('2023-01-01')), PARTITION p1 VALUES LESS THAN (TO_DAYS('2024-01-01')) ); ``` #### 2. **选择合适的数据类型** 为了支持更大的数值范围,建议使用 `BIGINT` 而不是 `INT` 来定义自增主键,以避免达到上限导致溢出错误。 #### 3. **调整自增步长与偏移量** 在集群或多实例环境下,可通过设置 `auto_increment_increment` 和 `auto_increment_offset` 避免不同节点间主键冲突 [^2]。 例如,在配置文件中设置: ```ini [mysqld] auto_increment_increment = 5 auto_increment_offset = 1 ``` #### 4. **监控自增使用情况** 定期检查自增计数器的状态,确保其不会因删除大量数据而浪费过多空间。可通过如下语句查看当前自增值: ```sql SHOW CREATE TABLE your_table; ``` ### 注意事项 - 自增主键并非适用于所有场景,尤其在分布式系统中,可能需要采用其他方式生成全局唯一 ID(如 Snowflake、UUID 等)。 - 对于已经存在的大型,添加或修改主键可能导致长时间锁,建议在低峰期操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值