sql >> データベース >  >> RDS >> Mysql

MySQL:テーブルにレコードが存在しない場合はレコードを挿入します

    UNIQUEのように、実際にこれを行うことを提案しているわけではありません。 Piskvor によって提案されたインデックス 他の人はそれを行うためのはるかに優れた方法ですが、実際にあなたが試みていたことを行うことができます:

    CREATE TABLE `table_listnames` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(255) NOT NULL,
      `address` varchar(255) NOT NULL,
      `tele` varchar(255) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB;
    

    レコードを挿入します:

    INSERT INTO table_listnames (name, address, tele)
    SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
    WHERE NOT EXISTS (
        SELECT name FROM table_listnames WHERE name = 'Rupert'
    ) LIMIT 1;
    
    Query OK, 1 row affected (0.00 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    SELECT * FROM `table_listnames`;
    
    +----+--------+-----------+------+
    | id | name   | address   | tele |
    +----+--------+-----------+------+
    |  1 | Rupert | Somewhere | 022  |
    +----+--------+-----------+------+
    

    同じレコードをもう一度挿入してみてください:

    INSERT INTO table_listnames (name, address, tele)
    SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
    WHERE NOT EXISTS (
        SELECT name FROM table_listnames WHERE name = 'Rupert'
    ) LIMIT 1;
    
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    +----+--------+-----------+------+
    | id | name   | address   | tele |
    +----+--------+-----------+------+
    |  1 | Rupert | Somewhere | 022  |
    +----+--------+-----------+------+
    

    別のレコードを挿入します:

    INSERT INTO table_listnames (name, address, tele)
    SELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
    WHERE NOT EXISTS (
        SELECT name FROM table_listnames WHERE name = 'John'
    ) LIMIT 1;
    
    Query OK, 1 row affected (0.00 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    SELECT * FROM `table_listnames`;
    
    +----+--------+-----------+------+
    | id | name   | address   | tele |
    +----+--------+-----------+------+
    |  1 | Rupert | Somewhere | 022  |
    |  2 | John   | Doe       | 022  |
    +----+--------+-----------+------+
    

    など...

    更新:

    #1060 - Duplicate column name 2つの値が等しい場合のエラー、内部SELECTの列に名前を付ける必要があります:

    INSERT INTO table_listnames (name, address, tele)
    SELECT * FROM (SELECT 'Unknown' AS name, 'Unknown' AS address, '022' AS tele) AS tmp
    WHERE NOT EXISTS (
        SELECT name FROM table_listnames WHERE name = 'Rupert'
    ) LIMIT 1;
    
    Query OK, 1 row affected (0.00 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    SELECT * FROM `table_listnames`;
    
    +----+---------+-----------+------+
    | id | name    | address   | tele |
    +----+---------+-----------+------+
    |  1 | Rupert  | Somewhere | 022  |
    |  2 | John    | Doe       | 022  |
    |  3 | Unknown | Unknown   | 022  |
    +----+---------+-----------+------+
    


    1. ベースラインの重要性

    2. PostgreSQLでタイムゾーンオフセットを使用して現在の日付と時刻を取得する方法

    3. MySQLレプリケーションが遅れている場合の注意点

    4. C#:OracleDbTypeとのOracleデータ型の同等性