[SQL] Transaction, DELETE FROM vs TRUNCATE


取引


トランザクションとは?

  • 原子化が必要なSQLを組み合わせて、タスク
  • と見なす方法
  • DDL、DML中のレコードのみ修正/追加/削除
    これらのSQL
  • は、
  • BEGINとENDまたはBEGINとCOMMITの間で使用される
  • ROLLBACK
  • トランザクションの例

  • 振り込み:引き出しと送金の2つのプロセスからなる
  • 引き出しが成功すれば送金が失敗すれば
  • は成立しない
  • この2つのプロセスが同時に成功するか失敗するか->原子は
  • を意味する
  • これらのプロセスをトランザクション
  • にマージする必要があります.

    トランザクションロジック

    BEGIN;
      A의 계좌로부터 인출;
      B의 계좌로 입금;
    END;
  • ENDとCOMMITは同じ
  • BEGIN以前の状態に戻りたい場合は、ROLLBACK
  • を実行します.
  • この動作は、コミットモード
  • に依存する.
  • が1つ失敗したら、BEGIN戦
  • に戻ります

    コミットモード:autocommit

  • autocommit = True
    -デフォルトでは、変更/削除/レコードの追加操作はすべてデータベースに直接書き込まれます.コミットと呼ぶ
    -特定のタスクをトランザクションにマージする場合は、BEGINおよびEND(COMMIT)/ROLLBACK処理
  • を使用します.
  • autocommit = False
    -COMMITが呼び出されるまで、変更/削除/追加レコードはコミットされません.

    SQLプログラムの送信

  • Google Collabのトランザクション
    -デフォルトでは、すべてのSQL文がすぐにコミットされます(autocommit=True)
    それを変えたいならBEGINEND; またはBEGIN;COMMIT(またはROLLBACK;)の使用
  • psycopg 2のトランザクション
    -可変パラメータautocommit
    -autocommit=Trueの場合、デフォルトではPostgreSQLのコミットモードと同じです.
    -autocommit=Falseはコネクタオブジェクトを表します.commit()と.トランザクションはrollback()関数で調整できます
    -好みは
  • DELETE FROM vs TRUNCATE


    DELETE FROM table_name(not DELETE*FROM)

  • 表から全レコード
  • を削除する.
  • VS. DROP TABLE table_name
  • WHEREを使用して特定のレコードのみを削除します.
    - DELETE FROM raw_data.user_session_channel WHERE channel = 'Google'
  • TRUNCATE table_name

  • DELETE FROM速度が遅い
  • TRUNCATEが表全体の内容を削除する場合、多くの点で遊離した
  • である
  • ですが、2つの欠点があります.
    -TRANCATEはWHEREをサポートしていません
    -TRANCATEはトランザクションをサポートしていません
  • SQLコードの使用


    送信

    %%sql
    
    DROP TABLE IF EXISTS adhoc.keeyong_name_gender;
    CREATE TABLE adhoc.keeyong_name_gender (
      name varchar(32),
      gender varchar(16)
    );
    INSERT INTO adhoc.keeyong_name_gender VALUES ('Ben', 'Male'), ('Maddie', 'Female');
  • テーブルと各カラム、各カラムのプロパティを作成し、データ価値
  • を提供します.
  • テーブルと値
  • が正常に作成されます.
  • 赤信号
  • 接続
    conn = get_Redshift_connection(False)
    cur = conn.cursor()
  • パラメータで
  • を自動的にコミットするかどうかを設定する.
    cur.execute("SELECT * FROM adhoc.keeyong_name_gender;")
    res = cur.fetchall()
    for r in res:
      print(r)
  • データベースからデータウェアハウスをインポートし、
  • にロードします.
  • の自動コミットがオフになっているため、トランザクションのコミット、Incertクエリのコミットによって実行するも、データベース
  • には影響しません.
    cur.execute("COMMIT;") 
  • コミット後に埋め込まれたコンテンツを削除して反映することができる
  • .

    rollback

    conn = get_Redshift_connection(False)
    cur = conn.cursor()
    try:
      cur.execute("DELETE FROM adhoc.keeyong_name_gender;") 
      cur.execute("INSERT INTO adhoc.keeyong_name_gender VALUES ('Claire', 'Female');")
      conn.commit()
    except (Exception, psycopg2.DatabaseError) as error:
      print(error)
      conn.rollback()
    finally :
      conn.close()
  • tryで2つのクエリーが発行され、そのうちの1つにエラーが発生した場合、除外で
  • をロールバックできます.
    conn = get_Redshift_connection(True)
    cur = conn.cursor()
    cur.execute("BEGIN;")
    cur.execute("DELETE FROM adhoc.keeyong_name_gender;")
    cur.execute("INSERT INTO adhoc.keeyong_name_gender VALUES ('Benjamin', 'Male');")
    cur.execute("END;")
  • try文を使用しなくても、クエリが正しい場合は問題ありません.
  • をロールバックできません.なぜなら、
  • ビットなどのエラー要求がデータベースに反映されているためです.