假设我想在表格中插入记录。每条记录都有一个ID(不是唯一的)
我想检查两列(比如名字和姓),如果这些列已经在我的表中,则使用该id,除非为新记录使用另一个id。
换句话说,我想说如果名称是新的,则分配一个新的ID,否则分配该记录的id。 (不要担心新的id,假设我有每个记录的原始id)
例如,假设我的表中有以下记录:
FirstName | LastName | Location | Age ... | ID
John | Smith | Canada | 12 ... | 1234
John | Smith | US | 21 ... | 1234
现在我要添加另一个约翰史密斯。所以我想要新记录的相同ID。如果我想添加Paul Smith,我想要一个新的ID。
答案 0 :(得分:2)
INSERT INTO YourTable (FirstName, LastName, Location, ID)
SELECT new.FirstName, new.LastName, new.Location, IFNULL(present.ID, new.ID)
FROM
(SELECT 'John' AS FirstName
, 'Smith' AS LastName
, 'UK' AS Location
, 1111 AS ID) AS new
LEFT OUTER JOIN YourTable AS present
ON present.FirstName = new.FirstName
AND present.LastName = new.LastName
ORDER BY present.ID DESC
LIMIT 1;
答案 1 :(得分:1)
您可以使用IFNULL
获取当前值或使用新值,但缺少该值。
INSERT INTO your_table (id, first_name, last_name, other_stuff) VALUES (
( SELECT IFNULL (
( SELECT id FROM your_table WHERE first_name = 'John' AND last_name = 'Doe'),
'new_id'
),
),
'John',
'Doe',
'Your other data'
)
虽然我觉得你试图为每个名字/姓氏组合分配一个唯一的id。根据您的使用情况,可能有更好的方法(如果我是对的),请保持id< - >例如,在单独的表中进行名称映射,并且仅使用您在此帖子中引用的表中的id。
答案 2 :(得分:0)
INSERT .... ON DUPLICATE KEY UPDATE
您还可以为重复键指定不同的操作以满足您的需要。 我相信您要检查的字段需要编入索引才能正常工作。
希望有所帮助。
答案 3 :(得分:0)
CASE WHEN EXISTS (SELECT * FROM `names` WHERE `first`=$first AND `last`=$last) THEN (SELECT MAX(`id`) FROM `names` WHERE `first`=$first AND `last`=$last) ELSE $new_id
...是您问题的最接近的字面答案。但是,在您的情况下,这可能会更好:
IFNULL(SELECT MAX(`id`) FROM `names` WHERE `first`=$first AND `last`=$last, $new_id)
CASE WHEN
是一个真正的if-then-else结构,而IFNULL
(或等效地,COALESCE
)只是在没有找到任何内容时提供默认值。