2

假设我想在表中插入一条记录。每条记录都有一个 ID(不是唯一的)我想检查两列(比如说名字和姓氏),如果这些列已经在我的表中,则使用该 ID,除非为新记录使用另一个 ID。
换句话说,我想说如果名称是新的,则分配一个新的 ID,否则分配该记录的 id。(不用担心新的 id,假设我每条记录都有一个原始 id)
例如假设我的表中有以下记录:

FirstName | LastName  | Location | Age ... | ID
John      | Smith     | Canada   | 12 ...  | 1234
John      | Smith     | US       | 21 ...  | 1234

现在我想添加另一个 John Smith。所以我想要新记录的相同 ID。如果我想添加 Paul Smith,我想要一个新的 ID。

4

4 回答 4

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;

SQLFiddle

于 2012-05-22T01:56:39.460 回答
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这个帖子。

于 2012-05-22T01:35:37.410 回答
0
INSERT .... ON DUPLICATE KEY UPDATE

您还可以为重复键指定不同的操作以满足您的需要。我相信您要检查的字段需要被索引才能工作。

希望有帮助。

于 2012-05-22T01:16:44.040 回答
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)仅在未找到任何内容时提供默认值。

于 2012-05-22T01:26:26.487 回答