auto_increment



mysql auto_increment在一定程度上类似oracle的sequence

CREATE TABLE t4
(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(15) NOT NULL
)
AUTO_INCREMENT = 2

1。一个表只能有一个auto_increment属性,且该列必须为主健的一部分

2。通过建表auto_increment = 2来设置初始值如上
  也可通过 ALTER TABLE tbl AUTO_INCREMENT = 100;来设置值
    注意此时,如果对auto_increment插入具体值,那么下一个值,为满足增加规则的值
    
    比如,在my.ini中设置 
    auto_increment_offset = 2//初始值
  auto_increment_increment = 3//增量

	测试如下:
	
	mysql>
	mysql> CREATE TABLE t4
	    -> (
	    -> id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
	    -> name VARCHAR(15) NOT NULL
	    -> );
	Query OK, 0 rows affected (0.08 sec)
	
	mysql>
	mysql> insert into t4 values(null,'123');
	Query OK, 1 row affected (0.03 sec)
	
	mysql> select * from t4;
	+----+------+
	| id | name |
	+----+------+
	|  2 | 123  |
	+----+------+
	1 row in set (0.00 sec)
	
	mysql> insert into t4 values(null,'1');
	Query OK, 1 row affected (0.03 sec)

	mysql> select * from t4;
	+----+------+
	| id | name |
	+----+------+
	|  2 | 123  |
	|  5 | 1    |
	+----+------+
	2 rows in set (0.00 sec)
	
	mysql> insert into t4 values(6,'6');
	Query OK, 1 row affected (0.02 sec)
	
	mysql> insert into t4 values(null,'7');
	Query OK, 1 row affected (0.02 sec)
	
	mysql> select * from t4;
	+----+------+
	| id | name |
	+----+------+
	|  2 | 123  |
	|  5 | 1    |
	|  6 | 6    |
	|  8 | 7    |
	+----+------+
	4 rows in set (0.00 sec)
	注意,最后一列id = 8而不是7也不是9, 8=5+[3] 5是last_insert_id() 而3是auto_increment_increment
	      id应为 last_insert_id() + auto_increment_increment的整数倍(可以但不限于1倍)
	      
3.last_insert_id()是所有表auto_increment的最新插入值,
  因此在并发的情况下,获取某表的最新插入auto_increment可能出现错误
  
4.MyISAM 及INNODB表,表中auto_increment最大值被删除,将不会被重用

5.建议对auto_increment属性列插入中使用null值(而不是使用0),或SQL中不书写该列

6.用"WHERE auto_col IS NULL"条件选择出新插入的行,即在INSERT后马上用:
  SELECT * FROM t4 WHERE id IS NULL;
选择出来的将是新插入的行,而非真正的满足"id IS NULL"条件的行。
但你要是再执行一次上述查询,则返回的又变成了真正的满足"a IS NULL"条件的行,
由于a是主键,因此肯定会返回空集。这看上去很诡异是吗,不过MySQL也不想这么干,为了支持 ODBC标准
不过可以将SQL_AUTO_IS_NULL设为0来禁止这一用法。
此方法获取last_insert_id不推荐



7.AUTO_INCREMENT属性也给复制带来了麻烦。一般情况下复制AUTO_INCREMENT属性能正确工作,但以下情况还是有问题:
   1. INSERT DELAYED ... VALUES(LAST_INSERT_ID())不能被正确复制
   2. 存储过程插入的使用AUTO_INCREMENT属性的记录不能被正确复制
   3. 通过"ALTER TABLE"命令增加AUTO_INCREMENT属性时在主从节点上产生的值可能是不一样的,因为这个各行AUTO_INCREMENT属性的值取决于物理上的存储顺序。
    
8.对于replication的master-master方式 为防止auto_increment字段的重复,可做如下设置
A服务器的my.cnf设置如下:

auto_increment_offset = 1
auto_increment_increment = 2

这样A的auto_increment字段产生的数值是:1, 3, 5, 7, ...

B服务器的my.cnf设置如下:

auto_increment_offset = 2
auto_increment_increment = 2

这样B的auto_increment字段产生的数值是:2, 4, 6, 8, ...

你可能感兴趣的:(oracle,sql,mysql,工作)