如何将整数列添加到MySQl 5.0中的String列

时间:2013-03-27 19:44:01

标签: mysql concat create-table

我想在字符串中添加一个整数列,因为我需要生成一个带有自动递增的数字部分的varchar变量。例如,P000001,P000002...

为了做到这一点,我在创建表时正在做的事情我已经采用了一个int字段ID,其中auto_increments和我连接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关键字的错误。 请帮忙

3 个答案:

答案 0 :(得分:1)

MySQL的文档(http://dev.mysql.com/doc/refman/5.1/en/create-table.html)说,“默认值必须是常量;它不能是函数或表达式。”为什么不在SELECT之后获取PatientID值:

SELECT CONCAT('P', LPAD(ID, 6, 0)) AS PatientID FROM tblAcceptTest;

答案 1 :(得分:0)

看起来你想在“P”后面有六位数,所以试试你的表达式:

CONCAT('P', LPAD(ID, 6, '0'))

答案 2 :(得分:0)

Mysql几乎不支持计算列。 您的规范中的患者ID可能是char(7)

CREATE TABLE tblAcceptTest(
    ID int AUTO_INCREMENT NOT NULL primary key,
    PatientID char(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`