如果值尚未存在,则更新单元格值

时间:2013-05-22 22:36:49

标签: php mysql

我必须更新TABLE File上的列TEST。此列包含与该行相关的文件。每个文件由|分隔。

一个例子可能是

ID    NAME    FILE
 1    apple   fruit.png | lemon.png

现在,当我向FILE列添加新文件时,我使用此查询:

$link->query("UPDATE TEST SET File = CONCAT(File, '$dbfilename') WHERE id = '$p_id'")

其中$dbfilename可以是pineapple.jpg |

问题是,如果$dbfilename值已经File,则会再添加一次,结果加倍。

如何检查File是否已包含$dbfilename,如果是,则不添加ID,甚至不执行查询?

3 个答案:

答案 0 :(得分:2)

这不是在数据库中存储信息的好方法。但我会在一秒钟内完成。要直接回答您的问题,可以将其用作SQL查询:

UPDATE TEST SET File = CONCAT(File, '$dbfilename')
WHERE id='$p_id'
    AND File NOT LIKE '%$dbfilename%'
    AND Lingua='$linguadilavoro'

但是,当一个文件pineapple.jpg并且您尝试添加another-pineapple.jpg

时,这可能会导致一些问题

真的,我认为你应该考虑这对数据库来说是多么糟糕的方法。考虑将文件分成第二个表。例如:

# a table for the fruit names
CREATE TABLE fruits (
    id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(250) NOT NULL,
    UNIQUE INDEX(name)
);

# a table for file names
CREATE TABLE files (
    fileid INT UNSIGNED NOT NULL DEFAULT PRIMARY KEY AUTO_INCREMENT,
    fruitid INT UNSIGNED,
    filename VARCHAR(250),
    UNIQUE INDEX(fruitid, filename)
);

# find all of the fruits with their associated files
SELECT fruits.id, fruits.name, files.filename
FROM fruits LEFT JOIN files ON fruits.id=files.fruitid

# add a file to a fruit
INSERT INTO files (fruitid, filename)
VALUES ('$fruitID', '$filename')
ON DUPLICATE KEY UPDATE fruitid=LAST_INSERT_ID(id)

答案 1 :(得分:1)

您必须为FILE选择ID。

然后使用explode将其分解为数组

然后检查使用in_array来确定是否应该添加

以下是一些(未经测试的)指导代码

$stmt = $link->query("SELECT File File from TEST WHERE id = '$p_id'");
$rec = $stmt->fetchAssoc();
$files = explode(" | ",$rec["FILE"]);
if (!in_array($dbfilename, $files)){
    // add to FILE
} else {
    // it's already there
}

答案 2 :(得分:0)

我会重新设计你的表结构并添加一个包含以下列的新表文件,而不是使用varchar字段表示多个值:

Table Test
TableId, Name

Table File
FileId, TestId, FileName