我想要一个带有(string,int)格式的复合主键,其中字符串是默认值,int设置为autoincrement。是否有可能实现这一目标。我需要以下格式
TC_01
TC_02
TC_03
.
.
.
等等
答案 0 :(得分:1)
由于在插入表格之前标识了自动递增的值,您最好依赖于表格上的插入触发器。
要设置TC_002
等格式的连接字符串,您需要在触发器主体中执行以下步骤。
如果您的str_field
定义为default 'TC'
,那么请说明
FOR EACH ROW BEGIN
SET NEW.str_field = concat( NEW.str_field, '_', NEW.auto_int_field );
END;
注意:
str_field
允许null并且您尚未定义默认值
值,你没有为插入输入相同的值,
concat( NEW.str_field, ...
会产生NULL
。您可以在unique key
和str_field
主键字段上定义复合auto_int_field
。
Constraint UK_CMP unique key ( str_field, auto_int_field )
编辑 :
当我使用此触发器时,在所有行中将str_field作为TC_0。但我应该得到TC_1,TC_2等。
你需要一个这样的例子:
mysql> drop table if exists cmp_pk;
Query OK, 0 rows affected (0.22 sec)
mysql> create table cmp_pk(
-> str varchar(10) not null unique default 'TC_',
-> id int not null auto_increment primary key,
-> constraint uk_cmp unique key( str, id )
-> );
Query OK, 0 rows affected (0.65 sec)
mysql>
mysql> drop trigger if exists bi_cmp_pk;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> delimiter //
mysql> create trigger bi_cmp_pk before insert on cmp_pk
-> for each row begin
-> SET @NEW_ID := ( SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES
-> WHERE TABLE_NAME='cmp_pk' AND TABLE_SCHEMA=DATABASE() );
-> SET NEW.str = concat( NEW.str, @NEW_ID );
-> end;
-> //
Query OK, 0 rows affected (0.07 sec)
mysql> delimiter ;
mysql>
mysql> insert into cmp_pk values();
Query OK, 1 row affected (0.06 sec)
mysql> select * from cmp_pk;
+------+----+
| str | id |
+------+----+
| TC_1 | 1 |
+------+----+
1 row in set (0.00 sec)
mysql>
mysql> insert into cmp_pk values();
Query OK, 1 row affected (0.06 sec)
mysql> select * from cmp_pk;
+------+----+
| str | id |
+------+----+
| TC_1 | 1 |
| TC_2 | 2 |
+------+----+
答案 1 :(得分:1)
DELIMITER $$
CREATE TRIGGER bi_cmp_pk
BEFORE INSERT ON cmp_pk
FOR EACH ROW BEGIN
SET @NEW_ID := ( SELECT last_insert_id()+1 from cmp_pk limit 1 );
SET NEW.str = concat( NEW.str, @NEW_ID );
end;
$$ DELIMITER ;
此触发器应解决您的问题
答案 2 :(得分:0)
实际上我不知道你究竟想要什么,但是这段代码可以帮助你
CREATE TABLE tbl_name (
col1 varchar(255) DEFAULT 'TC_',
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (col1,id));