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 |
+----+---------+-----------+------+
방법: " " " 를 만듭니다.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
'itsource' 카테고리의 다른 글
| PDO의 두 결과 비교 (0) | 2022.09.24 |
|---|---|
| 스프링 부트 2.0 이행 후: driverClassName에는 jdbcUrl이 필요합니다. (0) | 2022.09.24 |
| DOM 변경 검출 (0) | 2022.09.24 |
| 날짜별 Panda DataFrames 필터링 (0) | 2022.09.24 |
| Spring Boot Rest 서비스에서 파일 다운로드 (0) | 2022.09.24 |