MySQL Insert Where 쿼리


121

이 쿼리의 문제점 :

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

WHERE절 없이 작동합니다 . SQL을 잊은 것 같네요 ..

답변:


237

MySQL INSERT 구문 은 WHERE 절을 지원하지 않으므로 쿼리가 실패합니다. id열이 고유하거나 기본 키 라고 가정합니다 .

ID 1로 새 행을 삽입하려는 경우 다음을 사용해야합니다.

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);

ID가 1 인 기존 행의 weight / desiredWeight 값을 변경하려는 경우 다음을 사용해야합니다.

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;

원하는 경우 INSERT .. ON DUPLICATE KEY 구문을 다음과 같이 사용할 수도 있습니다.

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

또는 그렇게 :

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

또한 id열이 자동 증가 열이면 INSERT에서 모두 생략하고 mysql이 정상적으로 증가하도록 할 수 있다는 점에 유의하는 것도 중요합니다 .


1
좋은 답변 감사합니다. UPDATE 쿼리를 사용하면 제대로 작동합니다. 단, id가 primary key & auto increment key이면 위의 INSERT 문은 작동하지 않습니다. Error Duplicate entry '
1'for

1
@JDeveloper 행이 이미 존재하기 때문입니다. Chad가 If you're trying to insert a new row with ID 1 you should be usingINSERT INTO를 언급했듯이 . 귀하의 경우 ID 1이 이미 존재하고 기본 또는 고유
키일

41

WHERE 절을 VALUES 절과 결합 할 수 없습니다. 내가 아는 한 두 가지 옵션이 있습니다.

  1. INSERT 지정 값

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. SELECT 문을 사용하여 INSERT

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1

19

UPDATE 쿼리에 WHERE 절을 사용합니다. INSERT 할 때 행이 존재하지 않는다고 가정합니다.

OP의 진술은 다음과 같습니다.

UPDATE 사용자 SET weight = 160, desiredWeight = 45 여기서 id = 1;

MySQL에서 INSERT 또는 UPDATE를 원할 경우 WHERE 절과 함께 REPLACE 쿼리를 사용할 수 있습니다. WHERE가 존재하지 않으면 INSERTS하고 그렇지 않으면 UPDATES합니다.

편집하다

나는 Bill Karwin의 요점이 코멘트에서 빠져 나와 그것을 매우 분명하게 만들기에 충분히 중요하다고 생각합니다. 감사합니다 Bill, MySQL로 작업 한 지 너무 오래되었습니다. REPLACE에 문제가 있다는 것을 기억했지만 그게 뭔지 잊어 버렸습니다. 내가 찾아 봤어야했는데.

그것은 MySQL의 REPLACE가 작동하는 방식이 아닙니다. DELETE (행이없는 경우 no-op 일 수 있음)와 INSERT를 수행합니다. 결과에 대해 생각해보십시오. 트리거 및 외래 키 종속성. 대신 INSERT ... ON DUPLICATE KEY UPDATE를 사용하십시오.


7
그것은 MySQL의 REPLACE가 작동하는 방식이 아닙니다. DELETE (행이없는 경우 no-op 일 수 있음)와 INSERT를 수행합니다. 결과 vis를 생각하십시오. 트리거 및 외래 키 종속성. 대신 INSERT ... ON DUPLICATE KEY UPDATE를 사용하십시오.
Bill Karwin


5

검색어 삽입은 where 키워드 *를 지원하지 않습니다.

하위 선택 문에 where 조건을 사용할 수 있으므로 조건이 적용됩니다. 하위 선택을 사용하여 복잡한 삽입을 수행 할 수 있습니다.

예를 들면 :

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';

insert 문에 "select"를 입력하면 다중 삽입을 빠르게 수행 할 수 있습니다.

이 유형의 삽입을 사용하면 삽입되는 행 수를 확인할 수 있습니다. 삽입을 수행하기 전에 다음 SQL 문을 실행하여 삽입 될 행 수를 결정할 수 있습니다.

SELECT count(*)
FROM customers
WHERE city = 'Newark';

EXISTS 조건을 사용하여 중복 정보를 삽입하지 않도록 할 수 있습니다.

예를 들어 기본 키가 client_id 인 clients라는 테이블이있는 경우 다음 문을 사용할 수 있습니다.

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

이 문은 하위 선택으로 여러 레코드를 삽입합니다.

단일 레코드를 삽입하려면 다음 문을 사용할 수 있습니다.

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

이중 테이블을 사용하면 값이 현재 테이블에 저장되어 있지 않더라도 select 문에 값을 입력 할 수 있습니다.

Where 절을 사용하여 삽입하는 방법 도 참조하십시오.


4

이 질문에 대한 정답은 다음과 같습니다.

ㅏ). 삽입하기 전에 선택하려면 :

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;

비). 레코드가 이미있는 경우 삽입 대신 업데이트를 사용하십시오.

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

해야한다

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

씨). 동시에 업데이트 또는 삽입하려는 경우

Replace Users set weight=160, desiredWeight=145  WHERE id = 1;

Note):- you should provide values to all fields else missed field in query 
        will be set to null

디). 동일한 테이블에서 레코드를 복제하려면 삽입하려는 테이블에서 선택할 수 없다는 것을 기억하십시오.

 create temporary table xtable ( weight int(11), desiredWeight int(11) ;

 insert into xtable (weight, desiredWeight) 
    select weight, desiredWeight from Users where [condition]

 insert into Users (weight, desiredWeight) 
    select weight , desiredWeight from xtable;

나는 이것이 대부분의 시나리오를 포함한다고 생각합니다.


3

INSERT 문을 수행 할 때 WHERE를 사용할 수 없습니다.

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

해야한다:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );

WHERE 부분은 SELECT 문에서만 작동합니다.

SELECT from Users WHERE id = 1;

또는 UPDATE 문에서 :

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;

2

Insert into = 테이블에 행 추가

업데이트 = 특정 행을 업데이트합니다.

삽입에서 where 절은 무엇을 설명합니까? 일치 할 항목이없고 행이 존재하지 않습니다 (아직) ...


2

사용자 입력을 기반으로 조건부 INSERT를 수행 할 수 있습니다. 이 쿼리는 입력 변수 '$ userWeight'및 '$ userDesiredWeight'가 비어 있지 않은 경우에만 삽입됩니다.

INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1

상황에 따라 INSERT가 실제로 where 절을 가질 수 있습니다.

예를 들어 양식의 값을 일치시키는 경우입니다.

Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com

말이되지 않나요?


가능 어디에 삽입 문에 절
Taja_100

1

가장 간단한 방법은 IF를 사용하여 키 제약 조건을 위반하는 것입니다. 이것은 INSERT IGNORE에서만 작동하지만 INSERT에서 제약 조건을 사용할 수 있습니다.

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');

1

WHERE절 뒤에 조건을 입력하면 데이터를 가져 오거나 행을 업데이트하는 데 사용됩니다. 데이터를 삽입 할 때 행이 존재하지 않는다고 가정합니다.

그래서 질문은 ID가 1 인 행이 있습니까? 그렇다면 MySQL UPDATE 를 사용하고 그렇지 않으면 MySQL INSERT를 사용하십시오 .


1

데이터 삽입을 위해 특정 레코드 번호를 지정하는 경우 UPDATE문 대신 문 을 사용하는 것이 좋습니다 INSERT.

질문에 작성한 이러한 유형의 쿼리는 더미 쿼리와 같습니다.

귀하의 검색어는 :-

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

여기에서, 당신은 그래서 더 나은 사용, 아이디 = 1을 지정하는 UPDATE사용하지 않는 것이 좋습니다 기존 record.It를 업데이트 문을 WHERE의 경우 절 INSERT우선은 사용해야합니다 UPDATE.

이제 업데이트 쿼리 사용 :-

UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;

No mate.1st query will not work. 첫 번째 쿼리는 질문입니다.
JDGuide 2012 년

삽입보다 업데이트를 제안하는 이유는 무엇입니까? 사용자가 기존 레코드를 업데이트하지 않고 조건이있는 값을 삽입하려고합니다.
Somnath Muluk

1

WHERE-clause는 어떤 경우에도 INSERT-INTO-VALUES와 함께 실제로 사용될 수 있습니까?

대답은 확실히 아니오입니다.

INSERT INTO ... VALUES ... 뒤에 WHERE 절을 추가하는 것은 유효하지 않은 SQL이며 구문 분석하지 않습니다.

MySQL에서 반환하는 오류는 다음과 같습니다.

mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1

오류 메시지의 가장 중요한 부분은

... syntax to use near 'WHERE id = 1' ...

파서가 여기서 찾을 것으로 예상하지 못한 특정 부분 인 WHERE 절을 보여줍니다.


1

완전히 잘못되었습니다. INSERT QUERY에는 WHERE 절이 없으며 UPDATE QUERY에만 있습니다. id = 1 인 데이터를 추가하려면 쿼리가

UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;

1

아니요. 내가 아는 한이 쿼리에 WHERE 절을 추가 할 수 없습니다. 어쨌든 SQL이 왜 필요한지 잘 모르겠 기 때문에 SQL도 잊어 버렸을 것입니다.


1

Insert 문에서 where 조건을 사용하면 안됩니다. 원하는 경우 업데이트 문에 삽입을 사용한 다음 기존 레코드를 업데이트합니다.

실제로 Insert 문에 where 절이 필요한 이유를 알 수 있습니까 ??

이유에 따라 더 나은 옵션을 제안 할 수도 있습니다.


1

최선의 선택은 INSERT 대신 REPLACE를 사용하는 것입니다.

사용자 (id, weight, desiredWeight) VALUES (1, 160, 145);


1

이것도 잘 읽으십시오

말이 안 돼 ... 말 그대로

INSERT을 추가하고 에서 말하는 행을 정의 new row한다고 말할 때 .WHERESQL

따라서 기존 행에 대한 조건으로는 새 행을 추가 할 수 없습니다.

다음 중에서 선택해야합니다.

A. UPDATE대신 사용INSERT

B. 절을 사용 INSERT하고 제거하십시오 WHERE(내가 말하고 있습니다 ...) 또는 실제로 사용 INSERT하고 WHERE단일 문에서 INSERT..SELECT 절통해서만 수행 할 수 있습니다 ...

INSERT INTO Users( weight, desiredWeight ) 
SELECT FROM Users WHERE id = 1;

그러나 이것은 완전히 다른 목적으로 사용되며 id를 Primary Key로 정의한 경우이 삽입이 실패하고 그렇지 않으면 새 행이 id = 1로 삽입됩니다.


네 맞습니다.이 모든 것들이 깨어나서 실수를한다는 것을 알고 있습니다.
Asesha 조지

1

나는 이것이 오래된 게시물이라는 것을 알고 있지만 이것이 여전히 누군가에게 도움이되기를 바랍니다. 내가 바라는 것은 간단한 예입니다.

배경:

다 대다 사례가있었습니다. 동일한 사용자가 여러 값으로 여러 번 나열되어 새 레코드를 만들고 싶었습니다. 따라서 UPDATE는 제 경우에는 의미가 없으며 특정 사용자를 처리해야했습니다. WHERE 절을 사용합니다.

INSERT into MyTable(aUser,aCar)
value(User123,Mini)

이 구조를 사용하면 실제로 특정 사용자 (다른 레코드가있는 user123)를 대상으로하므로 where 절이 실제로 필요하지 않습니다.

출력은 다음과 같을 수 있습니다.

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

1

INSERT 및 WHERE를 사용하는 방법은

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); 이 경우 존재 테스트와 같지 않습니다. 두 번 이상 실행해도 예외는 없습니다.


0

post 메소드를 사용하여 mysql insert into 문에 대한 올바른 구문은 다음과 같습니다.

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";

1
사용자 이름과 같은 신뢰할 수없는 매개 변수를 이스케이프하거나 매개 변수가있는 쿼리를 사용하여 공격자가 임의의 SQL 명령삽입 하지 못하도록해야 합니다 . 그리고 HashCrypt 알고리즘 중 하나를 사용하여 암호를 저장하십시오.
Hendrik Brummermann

0

삽입 문에서 where 절을 사용할 수 있다고 생각하지 않습니다.


0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1
제안 된 답변을 편집하여 이것이 수행하는 작업과 OP를 해결하는 방법을 확장 할 수 있습니까?
Ro Yo Mi

0

INSERT와 WHERE를 함께 사용할 수 없습니다. 아래 코드와 같이 특정 필드의 특정 열에 값을 추가하기 위해 UPDATE 절을 사용할 수 있습니다.

UPDATE Users
SET weight='160',desiredWeight ='145'  
WHERE id =1

0

지정된 행에 값을 삽입하는 올바른 형식은 다음과 같습니다.

UPDATE table SET column = value WHERE columnid = 1

작동하며 Microsoft SQL Server에서 작성하는 경우 유사합니다.

INSERT INTO table(column) VALUES (130) WHERE id = 1;

mysql에서는 테이블을 업데이트해야합니다.


0

아래 코드로 수행 할 수 있습니다.

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.