• ベストアンサー

SERIAL型の省略入力について

http://okwave.jp/qa2956072.html 上で同じような質問を過去にしましたが、状況がちょっと違うようでしたので再度質問させてください。 列の型をserialで指定しテーブルを作りました。 入力を省略したところPermission Deniedのエラーが出ました。 前回の質問では権限が異なるIDでINSERTしようとしたのでは?と回答をいただきましたが、状況がちょっと違っていたようです。 $sth = $dbh->do("insert into $table (filepath,filename,filesize,confirmdate,upload,filenumber) values ('$list[$count]->[0]','$list[$count]->[1]','$list[$count]->[2]','$today','$today','12')"); と入力すると12という番号でINSERTできます。 $sth = $dbh->do("insert into $table (filepath,filename,filesize,confirmdate,upload) values ('$list[$count]->[0]','$list[$count]->[1]','$list[$count]->[2]','$today','$today')"); しかし上記のように省略するとエラーが出ます。 本にも省略した場合自動的に番号が割り振られるとありますが、具体的にどう省略したらよいのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>しかし上記のように省略するとエラーが出ます。 具体的には、どういうエラーですか? 下記の例のように、serial指定列を省略して、格納可能です。 <定義例> create table t1 (c1 serial, c2 int); <格納例> insert into t1(c2) values(100); 明示的にnextvalで指定する場合は、連番型につけられた名前を指定する必要があります。この名前は、「表名_列名_seq」という名前になります。 上記の例では、次のようなSQLで格納できます。 <格納例2> insert into t1 values(nextval('t1_c1_seq'),200);

参考URL:
http://www.postgresql.jp/document/pg800doc/html/datatype.html#DATATYPE-SERIAL
tukikageran
質問者

お礼

ありがとうございます。 シーケンス名を入れなくてはいけなかったんですね。 そこがよくわかっていませんでした。 おかげで解決いたしました。 ありがとうございました。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

]->[2]','$today','$today','12')"); の12の部分に値を入れる必要があるので、「次の値」nextvalueを記述。 (Oracleも同じ)。 「PostgreSQL SERIAL NEXTVALUE」をキーワードに検索してみてください。

tukikageran
質問者

お礼

ありがとうございます。 検索してみましたところ、 INSERT INTO distributors VALUES (nextval('serial'), 'nothing'); という使用例がありましたので、 12の代わりにnextval('serial')といれてみましたがエラーがでました。 他にもnextval('')とかnextvalとかnextval('?')とかもいれてみたんですが、全部エラーになってしまいました。 nextvalueともいれてみましたが同じくエラーになりました。 正確な構文ってどう書けばいいのでしょうか??

関連するQ&A