【问题标题】:MYSQL - append or insert value into a column depending on whether it's empty or notMYSQL - 将值附加或插入到列中,具体取决于它是否为空
【发布时间】:2015-05-06 13:27:33
【问题描述】:

正如标题所说,我试图将string 附加到我表中的VARCHAR 列。 字符串类似于“ //string ”,后面将使用正斜杠将字符串分解为 PHP 中的数组。 我想知道如果列为空,in MYSQL 是否有办法执行 CONCAT(columnname, "//string") ,否则执行正常的 UPDATE ... SET ... WHERE 。通过这种方式,我将避免 第一个 我未来的爆炸字符串的值成为带有正斜杠的“//字符串”。

另外,上面我使用 bold 字符表示“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 }

但这意味着由于 2 次数据库调用和更多 PHP 代码而浪费时间/资源。

谢谢。

【问题讨论】:

  • y 不是两者都 - 首先使用 where 条件应用更新,然后插入 where not in
  • 用户是否已经存在该行?
  • 是的,该用户的行已经存在.. 我说的是 INSERT,但我的意思是 UPDATE tablename SET columnname='//string' WHERE [..等等..]跨度>
  • 我编辑了问题以澄清

标签: php mysql string concatenation


【解决方案1】:

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');

【讨论】:

  • 我不能接受作为答案,因为我不能在该列中使用 UNIQUE。另外,我猜你的意思是“VALUES('string')”而不是“VALUES('//string')”..但这接近我的目标..编辑:我什至不能在这个语句中使用 WHERE。
  • 所以给我你的CREATE TABLE声明。你没有提供任何东西。但是要查看记录是否与另一条记录重复,无论如何我们都应该有一个唯一的键。所以提供你的表结构
  • 我不必检查记录是否重复。我只需检查列是否为空。甚至我可以更改 NOT NULL 并将 DEFAULT NULL 设置为 ' //string' 如果它不为 null 或 UPDATE 到 'string' 如果它是 NULL (这意味着这是第一个 INSERT 到该列)
【解决方案2】:

如果你想要的是这样的:

第一个字符串:列将包含'firststring'

第二个字符串:列将包含'firststring//secondstring'

然后像这样进行更新:

UPDATE tablename SET columnname = CONCAT( IF(IFNULL(columnname,'')='','',CONCAT(columnname,'//')), :string) WHERE username=:user

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2020-03-20
    • 2013-08-23
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多