如何在MySQl 5.0中将整型列添加到字符串列
我想在字符串中添加一个整数列,这是因为我需要生成一个varchar变量,其中包含一个自动递增的数字部分。例如,如何在MySQl 5.0中将整型列添加到字符串列,mysql,concat,create-table,Mysql,Concat,Create Table,我想在字符串中添加一个整数列,这是因为我需要生成一个varchar变量,其中包含一个自动递增的数字部分。例如,P000001、P000002… 为了做到这一点,我在创建表时采用了一个int字段ID,该ID自动递增,并将p与00000和ID值连接起来 我创建的表是: CREATE TABLE tblAcceptTest( ID int AUTO_INCREMENT NOT NULL primary key, PatientID as CONCAT('P' , CONCAT('000000',CAS
P000001、P000002…
为了做到这一点,我在创建表时采用了一个int字段ID,该ID自动递增,并将p与00000和ID值连接起来
我创建的表是:
CREATE TABLE tblAcceptTest(
ID int AUTO_INCREMENT NOT NULL primary key,
PatientID as CONCAT('P' , CONCAT('000000',CAST(ID as char)))
);
它显示了as关键字的错误。
请帮助看起来您需要在“p”后面加上六位数字,因此请尝试以下表达式:
CONCAT('P', LPAD(ID, 6, '0'))
MySQL的文档()说,“默认值必须是常量;它不能是函数或表达式。”为什么不在选择之后获取PatientID值作为选择的一部分:
SELECT CONCAT('P', LPAD(ID, 6, 0)) AS PatientID FROM tblAcceptTest;
Mysql几乎不支持计算列。 规范中的患者ID可以是字符(7) 然后创建一些触发器。请注意,以下插入触发器将导致高并发服务器出现问题
DELIMITER |
CREATE TRIGGER tblAcceptTest_insert BEFORE INSERT ON tblAcceptTest
FOR EACH ROW BEGIN
DECLARE next_id INT;
SET next_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tblAcceptTest');
SET NEW.PatientID = CONCAT('P' , RIGHT(CONCAT('000000',next_id),6)) ;
END;
|
CREATE TRIGGER tblAcceptTest_update BEFORE UPDATE ON tblAcceptTest
FOR EACH ROW BEGIN
SET NEW.PatientID = CONCAT('P' , RIGHT(CONCAT('000000',NEW.ID),6)) ;
END;
|
DELIMITER ;
您可以使用关系和视图来实现相同的结果
CREATE TABLE `patient` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`patient` varchar(60) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `accepted_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`patient_id` int(11) NOT NULL,
`accepted` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `patient_id` (`patient_id`),
CONSTRAINT `accepted_test_ibfk_1` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create or replace view accepted_test_veiw as
select CONCAT('P' , RIGHT(CONCAT('000000',patient_id),6)) patient_key
, accepted
, id accepted_test_id
, patient_id
from accepted_test ;
select * from `accepted_test_veiw`
任何人都不支持表规范中的计算列。有关信息和可能的解决方法,请参见此问题:错误1064(42000):您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第3user2200561行使用near“as CONCAT('P',LPAD(ID,6,'0')))”的正确语法-抱歉,MySQL不支持虚拟/计算列。我应该说得更清楚:我的答案是如何创建所需的值(“P”后跟ID,左后加0至6位)。您可以在查询时使用它,也可以使用上面注释中的变通方法DanJ引用,或者将其合并到视图中。但是您不能将它用于计算列,因为MySQL中没有这样的东西。听起来不错!如果您决定尝试涉及触发器的解决方案,请告诉我您是否有任何问题;我会尽力帮忙的。
CREATE TABLE `patient` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`patient` varchar(60) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `accepted_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`patient_id` int(11) NOT NULL,
`accepted` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `patient_id` (`patient_id`),
CONSTRAINT `accepted_test_ibfk_1` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create or replace view accepted_test_veiw as
select CONCAT('P' , RIGHT(CONCAT('000000',patient_id),6)) patient_key
, accepted
, id accepted_test_id
, patient_id
from accepted_test ;
select * from `accepted_test_veiw`