2

テーブルにレコードを挿入したいとします。各レコードにはID(一意ではない)があります。2つの列(たとえば、名前と姓)を確認します。これらの列がすでにテーブルにある場合は、新しいレコードに別の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が必要です。

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;

SQLフィドル

于 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 に答える