[sql] MySQL Insert Where 쿼리

이 쿼리의 문제점 :

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

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



답변

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이 정상적으로 증가하도록 할 수 있다는 점에 유의하는 것도 중요합니다 .


답변

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

답변

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를 사용하십시오.


답변

삽입에 WHERE 절이 있다고 생각하지 않습니다.


답변

검색어 삽입은 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 절을 사용하여 삽입하는 방법 도 참조하십시오.


답변

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

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

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;

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


답변

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;