• 締切済み

SQLのUPDATE文について

SQLSERVER 2000を使っています。 項目1には新しい情報が入り、 項目2には以前の項目1の情報を残すというような データの更新のことで考えているのですが、 UPDATE tableA SET 項目1 = '新規', 項目2 = 項目1 というように、1度のSQLで処理してしまうのは安全なのでしょうか? 試しに実行してみたところ希望の結果を得ることができましたが、 先に項目1が更新されてその値を項目2も持ってしまうような気がして不安になっています。 2度の処理に分割すると余計な処理時間が発生してしまうと思い、 安全であると確証が持てるならば、1度で処理したいと思っています。 何かおわかりになることがあればアドバイス下さい。

  • soma3
  • お礼率94% (18/19)

みんなの回答

  • cse_ri2
  • ベストアンサー率25% (830/3287)
回答No.1

不安に思うのであれば、正規のMS-SQLServerの教育を受け、 正しい知識を習得することをオススメします。 SQL-Serverが内部でどういう動きをしているかについて精通 すれば、不安も自然と取り除かれるかと。 ちなみにSQL-Serverに限りませんが、通常のRDBMSであれば、 COMMIT文を発行するまでは書き込んだ値が確定しませんので、 書き込んだ結果に問題があるようであれば、ROLLBACK文を 実行すれば、元に戻ります。

soma3
質問者

お礼

回答ありがとうございます。 正規の教育というもの・・・受けてみたいです。 でも、実際は予算も時間も余裕がなく、 WEBと本で情報を漁るのが限界です。 それゆえに、知ってる方がいたらと質問させてもらいました。 また、トランザクション処理の方ですが、 書き込んだ結果に問題があるかどうかというのは、 UPDATE文実行後、チェックのためのSQL文を 実行すると言うことになるのでしょうか?

関連するQ&A

  • SQLiteのUPDATE文を教えてください。

    UPDATE tableA, tableB SET tableA.name = tableB.name WHERE tableA.id = tableB.id; 上記のSQLが他のデータベースでは動きますが、SQLiteでは動きません。 同意味のSQLはどう書くのでしょうか。お願いします。

  • 複雑なUPDATE文2

    先に質問をさせていただき、1度は解決したものの再び行き詰ってしまいました。 UPDATEの際うまくいかず困っています。 お知恵を拝借いただけると助かります。 使用バージョンはPostgresV7.3.4です。 tableA a1|a2|b|c -+--+-+- 1 | 1 | 1| 1 (★) 1 | 1 | 0| 1 1 | 2 | 0| 1 2 | 2 | 1| 0 2 | 1 | 0| 1 3 | 2 | 1| 1 (★) 3 | 2 | 0| 1 3 | 1 | 0| 1 b=1 and c=1 で一致する行を★行とする。 ★行のa1列の値とa2列の値(上記の例だと(a1=1,a2=1)と(a1=3,a2=1))をもつ行に対して 下記の条件◆でUPDATEを行う。 [条件◆] b=0 and c=1 [UPDATEの内容] 条件◆に一致したc列を3に更新する [理想の結果] tableA a1|a2|b|c -+--+-+- 1 | 1 | 1| 1 1 | 1 | 0| 3 ←更新 1 | 2 | 0| 1 2 | 2 | 1| 0 2 | 1 | 0| 1 ←★にあてはまらないので更新されない 3 | 2 | 1| 1 3 | 2 | 0| 3 ←更新 3 | 1 | 0| 1 ←最下行 ========================================== UPDATE tableA set c = 3 WHERE 条件◆ and a1 in (select a1 from tableA where b=1 and c=1) and a2 in (select a1 from tableA where b=1 and c=1) このようなイメージなのですが、この場合、 最下行のc列も更新してしまいました。 (説明しずらいのですが、) a1とa2の条件は独立させるのでは無く、セットとして考えたいのですが、 方法が分りません。 ご協力お願いします。 ==========================================

  • SQLのUpdateについて

    プログラム超初心者です。 開発環境;ASP.NET(visual studio2005) サーバ:SQLSERVER2005 sqldatasourceにupdate文を入れてマスタの更新処理を作っております。 対象のテキストボックスの値を空白にしたままupdate処理を走らせると、なぜか空白値がnull値となってDBに保存されてしまいます。 update処理をする際に空白値をnull値に変換しない方法ってありますか? ご教授お願いします。

  • 複雑なUPDATE文

    少し複雑なUPDATEをしているのですが、うまくいかず困っています。 お知恵を拝借いただけると助かります。 使用バージョンはPostgresV7.3.4です。 tableA a |b |c -+-+- 1 | 1 | 1 (★) 1 | 0 | 1 1 | 0 | 2 2 | 1 | 0 2 | 0 | 1 3 | 1 | 1 (★) 3 | 0 | 1 3 | 0 | 2 b=1 and c=1 で一致する行を★行とする。 ★行のa列の値(上記の例だとa=1,a=3)をもつ行に対して 下記の条件◆でUPDATEを行う。 [条件◆] b=0 and c=1 [UPDATEの内容] 条件◆に一致したc列を3に更新する [理想の結果] tableA a |b |c -+-+- 1 | 1 | 1 1 | 0 | 3 ●更新 1 | 0 | 2 2 | 1 | 0 ←★にあてはまらないので更新されない 2 | 0 | 1 3 | 1 | 1 3 | 0 | 3 ●更新 3 | 0 | 2 ========================================== ★の条件を考えない場合は、下記予想します。 UPDATE tableA set c = 3 WHERE 条件◆ ★の条件を考えた時、どのような条件にすればよいかさっぱり分かりません。 ご協力下さい。 ==========================================

  • SQL文のゼロ除算

    下記のSQL文でBがゼロのときエラーになります。 UPDATE TABLEa SET A = B / C 上記でエラーが出ないような(ゼロ除算エラー を回避できる)SQL文にする方法を知ってますか?

  • このSQL文を教えてください。

    Windows2000(SP3) SQLServer2000(SP3) で開発しています。 テーブルA 項目No,大分類コード,中分類コード,詳細コード,日付,内容 テーブルB 大分類コード,中分類コード,詳細コード,新_詳細コード,内容 TableA,Bでは大分類コード,中分類コード,詳細コードがリンクする このような状況で、TableA,Bを下記のようにjoinして、  TableA.大分類コード,   TableA.中分類コード,  TableB.新_詳細コード, が重複するデータを取得する場合のSQL文を教えてください。 (join) SELECT  TableA.*,  TableB.* FROM  TableA LEFT OUTER JOIN  TableB ON  TableA.大分類コード=TableB.大分類コード  AND  TableA.中分類コード=TableB.中分類コード  AND  TableA.詳細コード=TableB.詳細コード よろしくお願いします。

  • SQL文の質問です

    ------------------- |No|・・・|locate| ------------------- | 1|・・・| LA-01| ------------------- | 1|・・・| LA-02| ------------------- | 2|・・・| LA-01| ------------------- | 2|・・・| LA-01| ------------------- | 2|・・・| LA-02| ------------------- | 2|・・・| LA-03| ------------------- | 3|・・・| LA-03| ------------------- | 3|・・・| LA-03| ------------------- 上のように、運用上の問題で、キー項目が設定されていないDBが あり、その中の「locate」フィールドの値を更新しなくてはいけません。   旧 新 LA-01 → LA-02 LA-02 → LA-03 LA-03 → LA-01 「一旦、どれかをまったく別の値にUPDATEしたあと、  残り2つをUPDATEし、最初の1つを再度UPDATEする」 と考え実行してみたのですが、データの件数が多く、 UPDATE3回実行は処理時間がかかりすぎたため、 できれば、SQL1文で処理させたいのですが、 いい考えが浮かびません。 よい方法が無いか知恵をお貸しください。

  • UPDATE文について

    昨日こちらで自分の間違ったSQL文をご指摘頂き 時間計算の処理は実装する事が出来たのですが その後の計算処理が終わった後、計算結果をDBに格納する処理で 再度躓いてしまったので、再度のご教授お願いします。 $sql = "SELECT SUM(ROUND(労働時間/100, 0)) + ROUND(SUM(MOD(労働時間,100)) / 60, 2) AS total     FROM 労働時間テーブル WHERE id = 'ログインしている人のID';"; $total_Time = pg_query($con, $sql); $total_Time = pg_fetch_result($total_Time, 0, 'total'); // 確認のため、表示 echo $total_Time; で値はきちんと表示されおります。 しかし、この後UPDATE文で $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; pg_query($con, $sql); と打ち試しましたが、echoの時に表示された値がDBに格納されません。(>_<) 試しに $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; の'$total_Time'をSELECT文に変更したりもしましたが、echoの時に 表示されていた値とは違う値がDBに格納されるようになってしまいました。 どのように解決したらよいか、悩んでおります。 そもそもの考え方から間違っているのでしょうか? ご教授の程、よろしくお願い致します。

  • SQL UPDATE 文 GroupByの値を更新したい

    SQLの UPDATE文について質問させていただきます。 テーブル内のデータを日付と時間で GroupBy して カウント求めています。 求めた値(カウント)を、日付をキーにして同じテーブル内のフィールドに更新するSQLを作成したいと考えています。 GroupByして、カウントを求めることはできるのですが、 どうしても、UPDATE文を実行させることができません。 この処理は、SQLで行うことはできるのでしょうか? 下記に、UPDATE前と後のテーブルデータを記載しています。 日付   時刻 20090101 0:00  20090101 0:00 20090102 0:00 20090102 0:00 20090102 1:00 20090103 2:00 ↓ 日付   時刻 カウント 20090101 0:00 2 20090101 0:00 2 20090102 0:00 2 20090102 0:00 2 20090102 1:00 1 20090103 2:00 1 よろしくお願いいたします。

  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75