如何在MySQl 5.0中将整型列添加到字符串列

如何在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

我想在字符串中添加一个整数列,这是因为我需要生成一个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',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`