Mysql 将两个不同字符串的部分合并为新字符串

Mysql 将两个不同字符串的部分合并为新字符串,mysql,sql,Mysql,Sql,我在一个表中有三列PRODUCTID,PRODUCTNAME,PRODUCTCODE。 我希望插入一个新产品,从其他列创建PRODUCTID 如何将PRODUCTNAME的前两个字母和PRODUCTCODE的最后四个数字填入PRODUCTID 我不希望产品在表中重复,如果尝试,我希望表保持不变。默认的PRODUCTID是default 到目前为止,我得到了: INSERT INTO `v1_products` (`PRODUCTNAME`, `PRODUCTNUMBER`) VALUES ("E

我在一个表中有三列
PRODUCTID
PRODUCTNAME
PRODUCTCODE
。 我希望插入一个新产品,从其他列创建
PRODUCTID

如何将
PRODUCTNAME
的前两个字母和
PRODUCTCODE
的最后四个数字填入
PRODUCTID

我不希望产品在表中重复,如果尝试,我希望表保持不变。默认的
PRODUCTID
default

到目前为止,我得到了:

INSERT INTO `v1_products` (`PRODUCTNAME`, `PRODUCTNUMBER`) VALUES ("EXAMPLE", "EXAMPLE4444");

UPDATE `v1_products`

SET `PRODUCTID`=(SELECT CONCAT(
    (SELECT LEFT(`PRODUCTNAME`,2)) , (SELECT RIGHT(`PRODUCTNUMBER`,4))))

WHERE `PRODUCTID`= "DEFALT" AND `PRODUCTID`!=`PRODUCTID`

LIMIT 1

首先,我建议将
PRODUCTID
列设置为唯一。这将防止任何产品具有相同的值。如果您的默认PRODUCTID为“default”,那么您可能需要在更新ID后执行此操作

您的
UPDATE
语句很好,除了
WHERE
子句:

WHERE `PRODUCTID`= "DEFALT" AND `PRODUCTID`!=`PRODUCTID`
“DEFAULT”

`PRODUCTID`!=`PRODUCTID`
永远不会是真的

WHERE `PRODUCTID`= "DEFAULT"
应该足够了

以上内容将修复ID不正确的现有产品。现在您应该更改插入,以便为每个新产品正确设置
PRODUCTID
。只需添加update语句中使用的
CONCAT
即可:

INSERT INTO `v1_products` (`PRODUCTID`, `PRODUCTNAME`, `PRODUCTNUMBER`) 
VALUES (
    CONCAT(
        LEFT("EXAMPLE",2),
        RIGHT("EXAMPLE4444",4)),
    "EXAMPLE",
    "EXAMPLE4444");
从评论中的讨论中可以看到一个仅设置列值一次的示例:

INSERT INTO v1_products (PRODUCTNAME, PRODUCTNUMBER,PRODUCTID) 
VALUES ( 
    "EXAMPLE", 
    "EXAMPLE4444",
    CONCAT( LEFT(PRODUCTNAME,2), RIGHT(PRODUCTNUMBER,4)));

现在到底发生了什么?您试图用这个过滤器
实现什么,其中PRODUCTID=“DEFALT”和PRODUCTID=PRODUCTID
?您想做什么,
插入
更新
<代码>产品ID`=`PRODUCTID没有意义,因为只引用了一个表,所以
PRODUCTID
始终等于
PRODUCTID
我已使该列唯一,并且在第二次输入产品时出现错误(错误)。但是,表中输入了一条具有默认值的记录(我不希望发生这种情况)。请提供帮助您的意思是,如果您尝试输入具有重复产品id的产品,它将创建一个具有
默认值的
?不应该是这样。你的插页看起来像什么?我的插页显示在问题中。我相信,因为我的INSERT语句是先完成的,所以它会创建一个默认的记录,而我真正想要的是创建一个包含计算出的产品代码的完整记录。希望这是有道理的。@jbw哎呀。错过了。我将在我的答案中添加一个更新的INSERT。有没有办法在CONCAT中使用列名而不是使用“EXAMPLE”(引号),当我尝试时,会出现以下错误:#1136-列计数与第1行的值计数不匹配