2013-03-27 48 views
0

我想将整数列添加到字符串中,这是因为我需要生成一个自动递增数字部分的varchar变量。例如,P000001,P000002...如何将整数列添加到MySQl 5.0中的字符串列中

为了做到这一点我在做什么,而表的创建我采取了哪些auto_increments,我串联P与00000的int域ID和ID值

表我创建是:

CREATE TABLE tblAcceptTest(
ID int AUTO_INCREMENT NOT NULL primary key, 
PatientID as CONCAT('P' , CONCAT('000000',CAST(ID as char))) 
); 

它向我显示as关键字的错误。 请帮助

+0

有人请帮助 – user2200561 2013-03-27 19:53:27

+1

MySQL不支持表规范中的计算列。请参阅此问题的信息和可能的解决方法:[从另一列计算的列?](http://stackoverflow.com/questions/5222044/column-calculated-from-another-column) – 2013-03-27 19:57:14

回答

0

它看起来像你想要的“P”后六位数字,所以尝试一下本作你的表达:

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

先生它显示错误 – user2200561 2013-03-27 19:59:31

+0

错误1064( 42000):你的SQL语法有错误;检查与您的MySQL服务器相对应的手册,以便在第3行的CONCAT('P',LPAD(ID,6,'0')) ''附近使用正确的语法'' – user2200561 2013-03-27 20:00:00

+0

user2200561 - 对不起,MySQL不支持虚拟/计算列。我应该已经更清楚了:我的答案是你如何创建你想要的值(“P”后跟ID左填充0到6位)。您可以在查询时使用它,也可以在上面的注释中使用解决方法DanJ引用,也可以将它合并到视图中。但是你不能将它用于计算列,因为MySQL中没有这样的事情。 – 2013-03-27 20:08:30

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`