MYSQL - 根据列是否为空向列追加或插入值
MYSQL - append or insert value into a column depending on whether it's empty or not
正如标题所说,我正在尝试将 string
附加到我的 table 中的 VARCHAR
列。
字符串类似于“//string”,稍后将使用正斜杠将字符串分解为PHP中的数组。
我想知道如果列为空,in MYSQL 是否有办法执行 CONCAT(columnname, "//string")
,否则执行正常的 UPDATE ... SET ... WHERE
。这样,我将避免我未来的分解字符串的第一个值是带有正斜杠的“//字符串”。
此外,上面我使用了 粗体 字符表示“in MYSQL”,因为我知道我可以先查询数据库(检查该列是否为空)类似:
$q = $conn->dbh->prepare('SELECT columnname FROM tablename WHERE username=:user');
$q->bindParam(':user', $username);
$q->execute();
$check = $q->fetchColumn();
然后离开PHP决定执行哪个操作:
if ($check != '') { // PERFORM A CONCAT }
else { // PERFORM AN UPDATE }
但这将意味着浪费 time/resources,因为 2 次数据库调用和更多 PHP 代码。
谢谢。
https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
这意味着在你的情况下:
INSERT INTO tablename (id,columnname) VALUES (1,'//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
http://sqlfiddle.com/#!9/bd0f4/1
更新 只是为了向您展示您的选择:
http://sqlfiddle.com/#!9/8e61c/1
INSERT INTO tablename (id, columnname) VALUES (1, '//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
INSERT INTO tablename (id, columnname) VALUES (1, '//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE columnname='blahblah'), '//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE id=2), '//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE columnname='newone'), '//newone')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//newone');
如果你想要的是这个:
第一个字符串:列将包含 'firststring'
第二个字符串:列将包含 'firststring//secondstring'
然后像这样进行更新:
UPDATE tablename SET columnname = CONCAT( IF(IFNULL(columnname,'')='','',CONCAT(columnname,'//')), :string) WHERE username=:user
正如标题所说,我正在尝试将 string
附加到我的 table 中的 VARCHAR
列。
字符串类似于“//string”,稍后将使用正斜杠将字符串分解为PHP中的数组。
我想知道如果列为空,in MYSQL 是否有办法执行 CONCAT(columnname, "//string")
,否则执行正常的 UPDATE ... SET ... WHERE
。这样,我将避免我未来的分解字符串的第一个值是带有正斜杠的“//字符串”。
此外,上面我使用了 粗体 字符表示“in MYSQL”,因为我知道我可以先查询数据库(检查该列是否为空)类似:
$q = $conn->dbh->prepare('SELECT columnname FROM tablename WHERE username=:user');
$q->bindParam(':user', $username);
$q->execute();
$check = $q->fetchColumn();
然后离开PHP决定执行哪个操作:
if ($check != '') { // PERFORM A CONCAT }
else { // PERFORM AN UPDATE }
但这将意味着浪费 time/resources,因为 2 次数据库调用和更多 PHP 代码。
谢谢。
https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
这意味着在你的情况下:
INSERT INTO tablename (id,columnname) VALUES (1,'//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
http://sqlfiddle.com/#!9/bd0f4/1
更新 只是为了向您展示您的选择:
http://sqlfiddle.com/#!9/8e61c/1
INSERT INTO tablename (id, columnname) VALUES (1, '//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
INSERT INTO tablename (id, columnname) VALUES (1, '//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE columnname='blahblah'), '//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE id=2), '//string')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE columnname='newone'), '//newone')
ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//newone');
如果你想要的是这个:
第一个字符串:列将包含 'firststring'
第二个字符串:列将包含 'firststring//secondstring'
然后像这样进行更新:
UPDATE tablename SET columnname = CONCAT( IF(IFNULL(columnname,'')='','',CONCAT(columnname,'//')), :string) WHERE username=:user