itsource

MySQL: 테이블에 레코드가 없는 경우 삽입

mycopycode 2022. 9. 24. 12:36
반응형

MySQL: 테이블에 레코드가 없는 경우 삽입

다음 쿼리를 실행하려고 합니다.

INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name='value'
);

그러나 오류가 반환됩니다.기본적으로 레코드의 '이름' 필드가 이미 다른 레코드에 있는 경우 레코드를 삽입하지 않습니다. 새 이름이 고유한지 확인하려면 어떻게 해야 합니까?

게 하라고 하는 게 아니라UNIQUEPiskvor 등이 제안하는 index가 훨씬 더 나은 방법이지만 실제로 시도했던 작업을 수행할 수 있습니다.

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이 같을의 컬럼에 을 붙여야 .

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  |
+----+---------+-----------+------+

INSERT에서 구문을 사용할 없습니다.

방법: " " " 를 만듭니다.UNIQUE INDEX 필드(「유니크로 합니다.name하다

  • INSERT이 이미 하는 경우 합니다.) (이름은 이미 존재하는 경우
  • INSERT IGNORE(그것은 소리 없이 실패하다 이름이 이미 존재하는 경우 경고(오류 발생)를 발생
  • INSERT ... ON DUPLICATE KEY UPDATE, (「」)가 됩니다.UPDATE이름이 이미 존재하는 경우 마지막에 문서를 참조하십시오.)

★★★★★★★★★★★★★★★★」

INSERT INTO users (full_name, login, password) 
  SELECT 'Mahbub Tito','tito',SHA1('12345') FROM DUAL
WHERE NOT EXISTS 
  (SELECT login FROM users WHERE login='tito');

MySQL은 매우 귀여운 솔루션을 제공합니다.

REPLACE INTO `table` VALUES (5, 'John', 'Doe', SHA1('password'));

독자적인 프라이머리 키(여기서는 값 5)를 선언했기 때문에 매우 사용하기 쉽습니다.

INSERT IGNORE INTO `mytable`
SET `field0` = '2',
`field1` = 12345,
`field2` = 12678;

여기서 mysql 쿼리는 존재하지 않는 경우 레코드를 삽입하고 기존 유사한 레코드를 무시합니다.

----Untested----

다음 방법을 쉽게 사용할 수 있습니다.

INSERT INTO ... ON DUPLICATE KEY UPDATE ...

이렇게 하면 새로운 raw를 삽입할 수 있으며 중복 데이터가 있는 경우 특정 컬럼(The best columns is timestamps)을 바꿉니다.
예를 들어 다음과 같습니다.

CREATE TABLE IF NOT EXISTS Devices (
  id         INT(6)       NOT NULL AUTO_INCREMENT,
  unique_id  VARCHAR(100) NOT NULL PRIMARY KEY,
  created_at VARCHAR(100) NOT NULL,
  UNIQUE KEY unique_id (unique_id),
  UNIQUE KEY id (id)
)
  CHARACTER SET utf8
  COLLATE utf8_unicode_ci;

INSERT INTO Devices(unique_id, time) 
VALUES('$device_id', '$current_time') 
ON DUPLICATE KEY UPDATE time = '$current_time';

비슷한 문제를 극복하기 위해 표를 독특한 컬럼으로 수정했습니다.당신의 예를 들어, 작성 시 다음과 같은 것을 얻을 수 있습니다.

name VARCHAR(20),
UNIQUE (name)

삽입할 때 다음 쿼리를 사용합니다.

INSERT IGNORE INTO train
set table_listnames='Rupert'

테이블에서 원하는 인덱스를 얻을 수 없다면...

INSERT INTO table_listnames (name, address, tele)
    SELECT 'Rupert', 'Somewhere', '022'
        FROM some_other_table
        WHERE NOT EXISTS (SELECT name
                              FROM table_listnames
                              WHERE name='Rupert')
        LIMIT 1;

이 쿼리는 정상적으로 동작합니다.

INSERT INTO `user` ( `username` , `password` )
    SELECT * FROM (SELECT 'ersks', md5( 'Nepal' )) AS tmp
    WHERE NOT EXISTS (SELECT `username` FROM `user` WHERE `username` = 'ersks' 
    AND `password` = md5( 'Nepal' )) LIMIT 1

또한 다음 쿼리를 사용하여 테이블을 만들 수 있습니다.

CREATE TABLE IF NOT EXISTS `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(30) NOT NULL,
    `password` varchar(32) NOT NULL,
    `status` tinyint(1) DEFAULT '0',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

참고: 첫 번째 쿼리를 사용하기 전에 두 번째 쿼리를 사용하여 테이블을 생성하십시오.

Brian Hooper: 당신은 거의 요점을 짚었지만 당신의 Synatx에 오류가 있습니다.삽입이 작동하지 않습니다.데이터베이스로 테스트해 본 결과 정답은 다음과 같습니다.

INSERT INTO podatki (datum,ura,meritev1,meritev1_sunki,impulzi1,meritev2,meritev2_sunki,impulzi2)
            SELECT '$datum', '$ura', '$meritve1','$sunki1','$impulzi1','$meritve2','$sunki2','$impulzi2'
                FROM dual
                WHERE NOT EXISTS (SELECT datum,ura
                                      FROM podatki
                                      WHERE datum='$datum' and ura='$ura'

y 표의 예를 들어 보겠습니다.삽입은 Bian Hooper가 쓴 것과 거의 동일하지만, 다른 테이블에서 선택한 FROM DUAL 온트를 넣었습니다.신드님, 이반

이건 답이 아니라 메모예요.다음과 같이 삽입된 값이 중복될 경우 승인된 답변과 같은 쿼리는 작동하지 않습니다.

INSERT INTO `addr` (`email`, `name`) 
  SELECT * FROM (SELECT 'user@domain.tld', 'user@domain.tld') AS tmp 
  WHERE NOT EXISTS (
    SELECT `email` FROM `addr` WHERE `email` LIKE 'user@domain.tld'
  );

Error
SQL query: Copy Documentation

MySQL said: Documentation

#1060 - Duplicate column name 'user@domain.tld'

반대로, Mahbub Tito의 답변과 같은 질문은 잘 작동합니다.

INSERT INTO `addr` (`email`, `name`) 
  SELECT 'user@domain.tld', 'user@domain.tld' 
  WHERE NOT EXISTS (
    SELECT `email` FROM `addr` WHERE `email` LIKE 'user@domain.tld'
  );

1 row inserted.

마리아에서 테스트 완료DB

insert into customer_keyskill(customerID, keySkillID)
select  2,1 from dual
where not exists ( 
    select  customerID  from customer_keyskill 
    where customerID = 2 
    and keySkillID = 1 )

결과를 업데이트하지 않고 삽입하고 있습니다.기본 열에 이름 열을 정의하거나 고유한 열을 설정할 수 있습니다.

문제가 발생했습니다. Mike가 조언한 방법이 부분적으로 작동했습니다. Dublicate Column name = '0' 오류가 발생하여 쿼리의 구문을 다음과 같이 변경했습니다.

     $tQ = "INSERT  INTO names (name_id, surname_id, sum, sum2, sum3,sum4,sum5) 
                SELECT '$name', '$surname', '$sum', '$sum2', '$sum3','$sum4','$sum5' 
FROM DUAL
                WHERE NOT EXISTS (
                SELECT sum FROM names WHERE name_id = '$name' 
AND surname_id = '$surname') LIMIT 1;";

열 이름에 문제가 있었습니다.sum3는 sum4와 mysql이 dublicate 컬럼 이름을 던진 것과 같으며, 이 구문에 코드를 썼더니 완벽하게 동작했습니다.

비슷한 문제가 있어서 없으면 여러 개를 삽입해야 했습니다.위의 예에서 이 조합에 대해 설명했습니다.누군가 필요할 때를 대비해서 여기 있어요

주의: MSQL의 요구에 따라 모든 곳에 이름을 정의해야 했습니다.MySQL은 *에서도 동작합니다.

INSERT INTO names (name)
SELECT name
FROM
(
  SELECT name
  FROM
  (
     SELECT 'Test 4' as name
  ) AS tmp_single
  WHERE NOT EXISTS
  (
     SELECT name FROM names WHERE name = 'Test 4'
  )
  UNION ALL
  SELECT name
  FROM
  (
     SELECT 'Test 5' as name
  ) AS tmp_single
  WHERE NOT EXISTS
  (
     SELECT name FROM names WHERE name = 'Test 5'
  )
) tmp_all;

MySQL: 테이블 작성names(OIDint(11) NULL AUTO_increment가 아닙니다.namevarchar(32) COLATE utf8_unicode_ci가 늘이 아닌 프라이머리 키(OID고유 키name_UNIQUE(name) 엔진=InnoDB AUTO_INCREMENT=1;

또는

MSSQL: CREATE TABLE [names] ([OID] INT ID (1, 1) NULL, [name] NVARCHAR (32) NULL, PRIMARY KEY CLUSTED ([OID] ASC ) 。[ NONCLUSTRUSTERED INDEX [ Index_Names ] ( NAME ] ] [ NAME ]

이 쿼리는 PHP 코드에서 사용할 수 있습니다.

이 테이블에 ID 열이 있으므로 이 ID 열을 제외한 모든 열의 중복 여부를 확인해야 합니다.

#need to change values
SET @goodsType = 1, @sybType=5, @deviceId = asdf12345SDFasdf2345;    


INSERT INTO `devices` (`goodsTypeId`, `goodsId`, `deviceId`) #need to change tablename and columnsnames
SELECT * FROM (SELECT @goodsType, @sybType, @deviceId) AS tmp
WHERE NOT EXISTS (
    SELECT 'goodsTypeId' FROM `devices` #need to change tablename and columns names
    WHERE `goodsTypeId` = @goodsType
        AND `goodsId` = @sybType
        AND `deviceId` = @deviceId
) LIMIT 1;

이 시점에서 값이 설정되어 있는 행이 존재하지 않는 경우에만 새 항목이 추가됩니다.SET스트링

언급URL : https://stackoverflow.com/questions/3164505/mysql-insert-record-if-not-exists-in-table

반응형