mysql自动增加两列主键
我有多个数据库有相同的结构,其中数据有时被复制。 为了保持数据的完整性,我使用两列作为主键。 一个是数据库ID,它链接到一个关于每个数据库的信息的表。 另一个是桌子的钥匙。 它不是唯一的,因为它可能有多个行,这个值是相同的,但在database_id列中有不同的值。
我正计划把这两列变成联合主键。 不过,我也想设置表键自动增量 – 但基于database_id列。
EG,有了这个数据:
table_id database_id other_columns 1 1 2 1 3 1 1 2 2 2
如果我添加包含1的dabase_id的数据,那么我希望table_id自动设置为4.如果将dabase_idinput为2,那么我希望table_id被自动设置为3等。
什么是在MySql中实现这个最好的方法。
如果你正在使用myisam
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
对于MyISAM和BDB表,您可以在多列索引中的辅助列上指定AUTO_INCREMENT。 在这种情况下,AUTO_INCREMENT列的生成值计算为MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix。 当你想把数据放入有序组时,这很有用。
CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id; Which returns: +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+
举个例子:
mysql> CREATE TABLE mytable ( -> table_id MEDIUMINT NOT NULL AUTO_INCREMENT, -> database_id MEDIUMINT NOT NULL, -> other_column CHAR(30) NOT NULL, -> PRIMARY KEY (database_id,table_id) -> ) ENGINE=MyISAM; Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO mytable (database_id, other_column) VALUES -> (1,'Foo'),(1,'Bar'),(2,'Baz'),(1,'Bam'),(2,'Zam'),(3,'Zoo'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM mytable ORDER BY database_id,table_id; +----------+-------------+--------------+ | table_id | database_id | other_column | +----------+-------------+--------------+ | 1 | 1 | Foo | | 2 | 1 | Bar | | 3 | 1 | Bam | | 1 | 2 | Baz | | 2 | 2 | Zam | | 1 | 3 | Zoo | +----------+-------------+--------------+ 6 rows in set (0.00 sec)
这里有一个方法,当使用innodb,这也将是非常高性能,由于聚簇复合索引 – 只有innodb可用…
http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html
drop table if exists db; create table db ( db_id smallint unsigned not null auto_increment primary key, next_table_id int unsigned not null default 0 )engine=innodb; drop table if exists tables; create table tables ( db_id smallint unsigned not null, table_id int unsigned not null default 0, primary key (db_id, table_id) -- composite clustered index )engine=innodb; delimiter # create trigger tables_before_ins_trig before insert on tables for each row begin declare v_id int unsigned default 0; select next_table_id + 1 into v_id from db where db_id = new.db_id; set new.table_id = v_id; update db set next_table_id = v_id where db_id = new.db_id; end# delimiter ; insert into db (next_table_id) values (null),(null),(null); insert into tables (db_id) values (1),(1),(2),(1),(3),(2); select * from db; select * from tables;
您可以使两列主键 unique
且自动递增键primary
键。