MySQL自增主键知识点总结

说白了,MySQL的主键自动自增其实很简单,但是有很多技巧。
首先,我们来说说最重要的事情。
MyISAM和InnoDB引擎的自增值存储方式不同。
MyISAM直接将其存储在数据文件中,而InnoDB在5 .7 及更早版本中将其存储在内存中。
重启后,从表中查询最大值。
8 .0及以后版本,记录在Redolog中,重启后根据Redolog恢复。

还有一点就是,自我提升的变化规则也很有趣。
例如,如果插入一条记录并且没有指定自动递增列值,则它将自动递增。
当指定一个值时,步长从当前值开始循环增加,直到找到大于指定值的值。

我最初以为任何插入错误都会导致自动增量列损坏,但后来我意识到出了问题。
例如,如果列值超出范围,则当前的自增值不会改变。

还有另一个关键细节。
自增列锁不是事务锁,申请后立即释放。
在 MySQL 5 .0 之前,自动增量锁是基于语句的,但在 5 .1 及更高版本中,可以通过配置 innodb_autoinc_lock_mode 来控制锁定行为。

很多人都忽略了这一点。
binlog_format设置为STATMENT时,会出现自增列导致的主从数据不一致问题。
解决方案可能是在插入时指定ID或将binlog_format设置为ROW。

使用last_insert_id()时,请注意不同事务或同一事务中不同操作的返回值可能不同。
我认为在实际操作中值得多注意这些细节,以避免可能出现的问题。

mysql联合主键怎么创建

创建公共主键实际上非常简单。
只需使用 ALTERTABLE 语句即可。

例如,如果你有一个orders表,并且想要使用order_id和customer_id列作为公共主键,你可以这样写: SQL ALTER TABLE 订单添加主键 (order_id, customer_id);
有几点需要注意:
1 .必须尊重独特性。
即order_id和customer_id两列合并起来,每一行的值必须不同。
例如order_id=1 ,customer_id=1 00,该行是允许的; order_id=1 ,customer_id=1 00,这一行不允许,数据重复。
2 . 这两列不能为空,必须填充值。
如果为空,数据库会报错。
3 、主键一旦建立,就不容易改变。
不能直接修改。
您必须先删除原来的主键,然后再创建新的主键。
例如: SQL ALTER TABLE 命令 DROP PRIMARY KEY; ALTER TABLE 订单添加主键 (order_id, new_column);
还有一些优点:
快速查询。
数据库会给你建一个索引,用这两列作为条件来查询数据,速度就会提高。

强大的数据完整性。
企业可以确保每行数据都是唯一的。

但也有缺点:
占用更多存储空间。
索引占用空间。

数据更新较慢。
如果主键列的值发生变化,可能需要重建索引,从而影响写操作。

此外,如果您在创建表时考虑使用公共主键,则可以直接写入 CREATE TABLE 语句: SQL 创建表命令( order_id INT NOT NULL, customer_id INT NOT NULL, 订单日期日期, 主键(订单 ID、客户 ID) );
适用的场景是你的数据需要通过组合多列来唯一标识。
例如,在订单表中,仅 order_id 可能还不够。
必须加上customer_id才能完全确定一行数据。

只有两步:要么使用ALTER TABLE,要么在创建表时直接定义。

关键约束是:列必须唯一且不能为空。
如果主键发生更改,请务必小心。

总之,公共主键用得好,查询快,数据完整,但需要考虑空间和性能问题。

在MySQL中如何设置主键和外键