2011-03-31 11 views
0

現在、誤って入力されたデータがあります。基本的には、現在のレコードを更新し、新しいレコードを挿入するスキーマを実行する必要があります。テーブルはように設定されている:MySQL UPDATEとINSERTステートメント

cityID   int(10) 
    stateID   smallint(5) 
    orderEnterpriseID int(10) 
    isDefault   tinyint(3) 
    locationType  tinying(2) 

は今、すべてのレコードが0のlocationTypeを持って、私は5にそれを更新する必要があります。

UPDATE
table SET
tablelocationType = 5 WHERE tablelocationType = 0およびtableorderFromEnterprise = 0;

しかし、私はまた、重複したデータを持つ別のレコードを作成し、私は問題はこれらのSQL文のいくつかのまわりで私の頭をラップし、任意のヘルプは大歓迎されてい6にlocationTypeを設定する必要があります!!!!

+0

なぜ2ではありませんか?最初に挿入し、次に更新しますか? – Wrikken

+0

重複レコードを作成しますか?同じテーブルに? –

+1

私はあなたが本当に求めているのは、トランザクションであり、単一のステートメントではないと思います。あなたはそれを1つのステートメントとして行うことはできません。 –

答えて

1

すでに述べたように、まず、アップデートを実行します。

UPDATE 
table SET 
table.locationType = 5 WHERE table.locationType = 0 AND table.orderFromEnterprise = 0; 

続いていることを確認する、locationType = 5でレコードを制限するために覚えて、すべてのレコードをコピーして、挿入時に場所の種類として彼らに6を割り当て新しく追加されたレコードは、(thatsの場合はわからないのmysqlでさえ問題が、念のため)もコピーされていません。

INSERT INTO table 
(cityID, stateID, orderEnterpriseID, isDefault, locationType) 
SELECT t1.cityID, t1.stateID, t1.orderEnterpriseID, t1.isDefault, 6 
FROM table as t1 
WHERE t1.locationType = 5 

1文ではないが、あなたが心配している場合には、ジョブが行われます不一致については、ただをラップしてくださいトランザクションの2つのオペレーション

1

UPDATEステートメント内でこれを実行することはできません。更新は、テーブルに既にあるものだけを更新します。あなたは一つのフィールドを使用して、次の操作を行うことができ変えてエントリを複製する場合

INSERT table_name (cityID, stateID , orderEnterpriseID, isDefault, locationType) 
SELECT cityID, stateID , orderEnterpriseID, isDefault, 6 
FROM table_name 

はまた、我々は選択していることに注意してください(これのすべては、1文として実行されていることを、予めご了承ください)テーブルからのlocationTypeの代わりに。

ここで行うことは、場所の種類を6に置き換えたテーブルからすべてを選択し、これをテーブルに戻すことです。

+0

where節を使ってselectを制限することをお勧めします。これは、同じテーブルに行を挿入して、サーバが何をするのかわからないので、実際には新しく挿入された行をしかし、クエリの実行はすでに挿入が開始された時点ですでに完了している可能性があります。mysqlがそれをどのように処理するかわからないため、選択を制限する方が良いです;) – ntziolis

+0

ここに投稿する前にチェックしました。このような競合条件が可能であれば、これらのタイプのステートメントはSQLではまったく存在しません。私は、SQLクエリを発行して競合状態を作成することは、まったく可能ではないと確信しています。 –

+0

はそうではないと言っているのではなく、常に安全な側にいることを好むだけです。 – ntziolis

1

私はこれを単一のクエリで行うことはできないと思います。ただし、locationTypeを6に設定して重複行を挿入してからlocationTypesを0〜5に更新することができます。

insert into table (cityID, stateID, orderEnterpriseID, isDefault, locationType) 
select cityID, stateID, orderEnterpriseID, isDefault, 6 
from table 
where locationType = 0 and orderEnterpriseID = 0; 

# now your update query 
update table 
set locationType = 5 
where locationType = 0 and orderEnterpriseID = 0; 
関連する問題