sql >> データベース >  >> RDS >> PostgreSQL

PHP /MySQLINSERT機能の論理エラー

    エラー:

    • RETURNING 2番目のINSERTに句がありません ステートメント。

    • 2番目のINSERTの列の明示的なリストを提供します 声明も。

    • NULLを指定しないでください INSERT ステートメント 列のデフォルト(シリアル列?)を開始する場合は、キーワードDEFAULTを使用します。 または、列についてはまったく触れないでください。

    より良い解決策:

    data-moidifyingCTE を使用します 、PostgreSQL 9.1以降で利用可能で、すべてを1つのステートメントで実行し、サーバーへのオーバーヘッドとラウンドトリップを節約します。 (MySQLは、単純なCTEでさえも、そのようなことは何も知りません。)

    また、UPDATEをスキップします ロジックを再モデル化することによって。 nextval()を使用して1つのIDを取得します 、そしてたった2つのINSERTでやり遂げる ステートメント。

    このデータモデルを想定すると(質問でそれを提供する必要があります):

    CREATE TABLE institutions(i_id serial, name text, u_id int);
    CREATE TABLE staff(user_id serial, username text, password text, i_id int);
    

    この1つ クエリがすべてを実行します:

    WITH x AS (
        INSERT INTO staff(username, password, i_id) -- provide column list
        VALUES ('$username', '$password', nextval('institutions_i_id_seq'))
        RETURNING user_id, i_id
        )
    INSERT INTO institutions (i_id, u_id, name)
    SELECT x.i_id, x.user_id, '$institution'
    FROM   x
    RETURNING u_id, i_id; -- if you need the values back, else you are done
    

    データモデル

    データモデルを従来のn:m関係に変更することを検討するかもしれません。これらのテーブルと主キーを含めます:

    staff (u_id serial PRIMARY KEY, ...)
    institution (i_id serial PRIMARY KEY, ...)
    institution_staff (i_id, u_id, ...,  PRIMARY KEY(i_id, u_id)) -- implements n:m
    

    institution_staff.i_id UNIQUEはいつでも定義できます 、ユーザーが1つのinstitutionにのみ所属できる場合 。




    1. MySQL:すべてのタイムゾーンのUTCオフセットとDSTを選択するにはどうすればよいですか?

    2. DataSourceを使用したjetty-env.xmlにより、mvn jetty:runでWebAppContextが失敗します

    3. 月ごとのSQL結果グループ

    4. PostgreSQLで一重引用符で囲まれたテキストを挿入する