MySQL挿入場所クエリ


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が主キーで自動インクリメントキーの場合、上記のINSERTステートメントは機能しません。エラーキー1の重複したエントリ '1'
JDGuide

1
@JDeveloperこれは、行がすでに存在しているためです。チャドがIf you're trying to insert a new row with ID 1 you should be usingINSERT INTOに言及したように。あなたの場合、ID 1が既に存在し、それが主キーまたは一意のキーであるときに挿入しようとすると失敗するため、UPDATE構文またはINSERT .. ON DUPLICATE KEY構文を使用する必要があります
Anthony Hatzopoulos

41

WHERE句とVALUES句を組み合わせることはできません。私が知る限り、あなたには2つの選択肢があります-

  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 Users SET weight = 160、desiredWeight = 45 where id = 1;

MySQLでは、INSERTまたはUPDATEが必要な場合、REPLACEクエリをWHERE句とともに使用できます。WHEREが存在しない場合は挿入し、存在しない場合は更新します。

編集

ビル・カーウィンのポイントは、コメントを引き出して非常に明白にするのに十分重要だと思います。ビルに感謝します。MySQLを使用してから長い間、REPLACEに問題があったことを思い出しましたが、それが何であるかを忘れていました。調べれば良かったのに。

それはMySQLのREPLACEが機能する方法ではありません。DELETE(行が存在しない場合は何もしない)が行われ、その後にINSERTが行われます。その結果を考えてください。トリガーと外部キーの依存関係。代わりに、INSERT ... ON DUPLICATE KEY UPDATEを使用してください。


7
それはMySQLのREPLACEが機能する方法ではありません。DELETE(行が存在しない場合は何もしない場合があります)を実行し、その後にINSERTを実行します。その結果を考えてください。トリガーと外部キーの依存関係。代わりに、INSERT ... ON DUPLICATE KEY UPDATEを使用してください。
ビルカーウィン


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の主キーを持つクライアントという名前のテーブルがある場合、次のステートメントを使用できます。

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

この質問に対する正しい答えは、次のようになります。

a)。挿入前に選択したい場合:

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

b)。レコードが既に存在する場合は、挿入ではなく更新を使用します。

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

する必要があります

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

c)。同時に更新または挿入したい場合

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

d)。同じテーブルからレコードをクローンする場合は、挿入するテーブルから選択できないことに注意してください。

 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 =テーブルに行を追加する

Upate =特定の行を更新します。

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

理にかなっていますか?


insertステートメントのwhere句が可能か
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 IDを指定しているUPDATE既存のrecord.Itを更新する文が使用することをお勧めされていないWHERE場合の句をINSERT使用する必要があります。あなたUPDATE

更新クエリを使用しています:-

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

mate.1stクエリは機能しません。1番目のクエリが質問されます。
JDGuide 2012

挿入よりも更新を提案するのはなぜですか?ユーザーは、既存のレコードを更新せずに、条件付きの値を挿入したいと考えています。
Somnath Muluk

1

どんな場合でも、WHERE句を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を忘れてしまったのかもしれません。何故とにかくそれが必要なのか本当にわからないからです。


1

Insertステートメントではwhere条件を使用しないでください。必要な場合は、更新ステートメントで挿入を使用してから、既存のレコードを更新します。

Insertステートメントにwhere句が必要な理由を実際に知ることができますか?

多分私があなたにもっと良いオプションを提案するかもしれない理由に基づいています。


1

私はあなたの最良の選択肢はINSERTの代わりにREPLACEを使用することだと思います

REPLACE INTO Users(id、weight、desiredWeight)VALUES(1、160、145);


1

よく読んでください

それは意味がありません...文字通り

INSERTはa new rowを追加することを意味WHEREし、あなたがで話している行を定義すると言うときSQL

そのため、既存の行を条件として新しい行を追加することはできません。

次の中から選択する必要があります。

A.のUPDATE代わりに使用INSERT

B. 句を使用INSERTして削除するWHERE(私はそれを言っているだけです...)または、使用することに本当に縛られINSERTていWHEREて、単一のステートメントでそれを行うことができるのはINSERT..SELECT句を介してのみです...

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

しかし、これはまったく異なる目的に役立ち、idを主キーとして定義した場合、この挿入は失敗します。それ以外の場合、新しい行はid = 1で挿入されます。


はい、あなたは正しいです。これらすべての覚醒が間違いを犯すことを知っています。
Asesha George、2016

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); この場合、存在テストのようなものではありません。2回以上実行しても例外はありません...


0

mysqlメソッドのpostメソッドを使用したステートメントへの正しい構文は次のとおりです。

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

1
攻撃者が任意のSQLコマンドを挿入しないようにするには、ユーザー名などの信頼できないパラメータをエスケープするか、パラメータ化されたクエリを使用する必要があります。そして、HashCryptアルゴリズムの1つを使用してパスワードを保存します。
Hendrik Brummermann 2012


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.