プロが教えるわが家の防犯対策術!

pgAdmin IIIで新しいテーブルを作りSQL文の勉強をしているのですが、
DELETE文が実行できません。
○○というテーブルにある×××という項目が1と2という数値の場合その行を削除するという場合、
DELETE ○○ WHERE ××× IN (1,2)
で良いのでしょうか?
○○、×××ともに日本語でテーブルを作っています。
pgAdmin IIIの設定は特にいじっていません。
とりあえずテーブルを作ってSQL文を試したいと思ってやっているので、
DELETE文を実行する権限がないということはあるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>まず、最初に表示されるエラーですが、


>ERROR: syntax error at or near "部署コード" at character 26
>です。
>実行している文は、
>DELETE from 学生テーブル WHERE 所属コード IN (1001,1002)
>になります。

実行している文は「所属コード」で、エラーには「部署コード」となってます。
実行文とエラーはコピペで、間違いないですか??エラーコードとして
ありえないはずなので。。。

あと、××とか○○とかだと、そこの中にエラーの原因あったときにどうにも
しようがないので、隠さず全部書いてほしいです。(見たところそれほど機密情報の類ではないので)
    • good
    • 0

#2回答者です。



PostgreSQLのバージョン、OSは何でしょうか?

SQL中に「倍角の空白」といったものが、入ったりしていませんか?
    • good
    • 0

>DELETE文が実行できません



エラーの内容を、具体的に書きましょう。
実行したSQLも、詳しく書きましょう。

>DELETE ○○ WHERE ××× IN (1,2)

delete from 表名 where 列名 in(1,2)

>DELETE文を実行する権限がないということはあるのでしょうか?

アクセス権限を付与して運用(GRANTで付与、REVOKEで取り消し)している場合は、そういう設定もできます。何も設定していないなら、アクセス権限はチェックされません。

>「ERROR: syntax error at or near "××" 」

構文エラーなので、権限チェック等がされる以前の問題です。
入力したSQLを正確に質問に貼り付ければ、すぐにアドバイスを得られると思いますけど?

この回答への補足

質問の仕方という初歩的な指摘、ありがとうございます。

まず、最初に表示されるエラーですが、
ERROR: syntax error at or near "部署コード" at character 26
です。
実行している文は、
DELETE from 学生テーブル WHERE 所属コード IN (1001,1002)
になります。
所属コードはintです。
まだ解決できていないので引き続き自分でもがんばって見ます。

補足日時:2007/02/26 21:13
    • good
    • 0

>DELETE ○○ WHERE ××× IN (1,2)


FROMが抜けてますが、書き損じですか?
DELETE FROM ○○ WHERE ××× IN (1,2)

後は、×××の型の問題で、
DELETE FROM ○○ WHERE ××× IN ('1','2')
かな?

DELETEの為だけに何か権限が必要という事は、なかったと思います。

この回答への補足

書き損じだったようです。
参考にしている教本には載っていなかったのですが、
syntax errorの表記がテーブル名の○○の部分ではなくなりました。
解決に一歩近づいています。ありがとうございます。
しかしながら「ERROR: syntax error at or near "××" 」のエラーメッセージが出ます。
権限が必要ではないということなので、再チャレンジしたいと思います。

補足日時:2007/02/26 02:08
    • good
    • 0
この回答へのお礼

補足にも書いたのですが、
一歩進みました。まだ実行したいことは実現できていませんが…
しかし。ありがとうございます!

お礼日時:2007/02/26 02:12

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qテーブル単位のリストア

pg_dumpall > [出力ファイル名]

で作成したバックアップからテーブル単位でリストアする方法はないのでしょうか?

pg_dumpallのマニュアルを読むと、リストアはpsqlで行うことになっていますが、psqlのマニュアルには
テーブル単位で取り出すオプションなどはないようです。

また:pg_dumpallで作成したファイルを:

pg_restore -l [入力ファイル名]

の入力ファイルにすると、"pg_restore: [archiver] input file does not appear to be a valid archive"
エラーが発生します。

webでも調べてみたのですが、該当するページが見あたりません。
お手数ですがご教授ください。

Aベストアンサー

> 通常のエディタで開くことはもちろん、手作業で行うことは気が遠くなってしまいます。

そういうことでしたら、思いつくのは下記の様な方法でしょうか。

a. pg_dumpall ではなく pg_dump を使ってダンプする
 元のDBに接続でき、現在の状態のリストアでよいならば、この方法が簡単でしょう。
 例) pg_dump -h localhost -p 5432 -U user_hoge -t table_hoge db_hoge > dump.txt;
http://www.postgresql.jp/document/9.2/html/app-pgdump.html

b. スクリプト言語を使って対象のテーブルの箇所を抽出する
 perl や ruby などを使えば、対象部分を抽出するプログラムが割りと簡単に作れるかと思います。

c. サイズの大きいファイルも扱えるエディタを使って抽出する
 例えば、 vim などではサイズが大きくてもさほど不自由なく編集はできたと思います。
 検索機能で該当箇所への移動・選択を行い、新旧の2ファイルを開いてコピーすれば良いかと。

> 通常のエディタで開くことはもちろん、手作業で行うことは気が遠くなってしまいます。

そういうことでしたら、思いつくのは下記の様な方法でしょうか。

a. pg_dumpall ではなく pg_dump を使ってダンプする
 元のDBに接続でき、現在の状態のリストアでよいならば、この方法が簡単でしょう。
 例) pg_dump -h localhost -p 5432 -U user_hoge -t table_hoge db_hoge > dump.txt;
http://www.postgresql.jp/document/9.2/html/app-pgdump.html

b. スクリプト言語を使って対象のテーブルの箇所を抽出する
 pe...続きを読む

QPOSTGRESのデータの格納場所はどこでしょうか?

RedHat7.2/PostgreSQL7.2/という環境で、サーバーがクラッシュしてしまい、データを他のサーバに移し変えないといけなくなりました。そこで、PostgreSQLを再インストールしないとデータベースが使えない状況となりました。

データベースを再インストールするのは良いとして、どこかに格納されているはずのデータベースの内容を取り出し、復帰させたいのですが、方法はありますか?大変困っております。よろしくお願いします。

Aベストアンサー

No.1の追加です。
データの移設でよかったと思います。
または、データを読み込むときに、「iオプション」でディレクトリを指定して、元のファイルを読み込んでもよかったと思います。

Qtimestampのデータはどのようにして入力

するのでしょうか?

create table tablex(no serial primary key,time timestamp);

insert into tablex(time) values(?);

において?の部分に入れる文字列のフォーマットはどうなるのでしょうか?

例えば
2005年5月5日5時55分55秒
を入れるにはどうしたらいいのでしょうか?

Aベストアンサー

'2005-05-05 05:55:55'

Q複数の条件での絞り込み検索の仕方

PostgreSQLで複数の条件での絞り込み検索をしたいのです。

テーブルには
発売日、商品名、入荷日
があります。
例えば
発売日が2007年5月1日から5月5日で、商品名に「○○」もしくは「××」もしくは「△△」が含まれており、入荷日が一番新しいもの
という条件で検索したいのです。

発売日だけの絞込みならBetweenですし、商品名だけならor、入荷日の最新だったらmaxを使えば個別には検索できるのですが、これをまとめて一行でやるにはどうしたらよいのかわかりません。
それぞれでandでつなげてみましたが、orの条件がうまく反映されず、一個目の○○だけが検索に引っかかってる状態です。
××や△△もひっかかるようにするにはどう記述したらよいのでしょうか。

Aベストアンサー

データ件数がどのくらいあるのかは分かりませんが、ユニークなキーもなく、likeの任意一致をorでつなぐという方法は、性能を出せませんよ?

select *
from t1
where 入荷日 in(
select max(入荷日)
from t1
where 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')
)
and 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Qファイルに記述されている複数のSQL文を一度に実行させたい

こんにちわ。

ファイルに記述されているSQL文を、Linuxのコマンドラインなどから
実行したいと考えています。

ファイルに
insert into DB_NAME(aaa,bbb,ccc) values(111,222,333);
insert into DB_NAME(ddd,eee,fff) values(333,777,222);
insert into DB_NAME(aaa,ttt,ddd) values(111,000,999);
...

などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して
なんかしらの方法で一度に実行させたいのです。

mySQLでは、このようなやり方があるのですが
postgreではどのようにすればいいのか、わかりません。

どなたかご存知の方、よろしくお願い致します。

OSはLinuxです。

Aベストアンサー

#1の方も指摘されている通り、 psql を使えば出来ます。

psql で、-f オプションを使うか、該当のDBに接続して \i コマンドを使えば良いでしょう。
http://www.postgresql.jp/document/pg746doc/html/app-psql.html

SQLが記述されているファイルを insert_data.sql、
DBを testdb としますと
例1)-------------------------------------------------------------
$ psql testdb
Welcome to psql x.x.x, the PostgreSQL interactive terminal.




testdb=> \i insert_data.sql
testdb=> \q
-----------------------------------------------------------------

例2)-------------------------------------------------------------
$ psql testdb -f insert_data.sql
-----------------------------------------------------------------

注) ユーザのDBへのアクセス権によっては -U オプションや -W オプションも必要になります。

#1の方も指摘されている通り、 psql を使えば出来ます。

psql で、-f オプションを使うか、該当のDBに接続して \i コマンドを使えば良いでしょう。
http://www.postgresql.jp/document/pg746doc/html/app-psql.html

SQLが記述されているファイルを insert_data.sql、
DBを testdb としますと
例1)-------------------------------------------------------------
$ psql testdb
Welcome to psql x.x.x, the PostgreSQL interactive terminal.




testdb=> \i insert_data.sql
testdb=> \q...続きを読む

Qcastの使用法について(初心者です)

始めまして。初心者ですので基本的な質問になるかもしれませんがよろしくお願いします!

なぜかPostgreSQLを仕事に使うことになり、四苦八苦しています。

テーブルを作成しているときに、
create table syouhin (shinamono text, nedan int);
とするとします。
で、insert でデータを入れていきますが、
例:
shinamono | nedan
------------------
みかん |100
マンゴー |200

例えば、nedan のcast が今、int にしましたが、これをchar やfloatに変えたいときはどうすればよろしいのでしょうか?

どなたか御存じの方、お手数ですがお教え下さい!!!

Aベストアンサー

CAST関数の文法は、CAST(○ AS △) となります。
○:変換する値
△:変換する型

Select CAST(nedan AS char(10)) ~
とすればできると思いますよ

QPostgreSQL 8.0.2 の ERROR: relation does not exist.

エラーの詳細は以下のとおりです。

まず、ダウンロード後解凍したpostgresql-8.0-ja.msiを
ダブルクリックして、Windows2000serverSP4 に
postgreSQL8.02 をインストールしました。
このときユーザpostgreも新規作成しました。

つぎに、ツールpgAdmin3を使用して上記postgreユーザで
データベースtemplate1のpublicスキームの中に、
ID(int4), Book(text)の2フィールド、IDフィールドをキーとして、
tblBooksという名称の練習用の簡単なテーブルを作成しました。

さらに、pgAdmin3を使用して、このtblBooksテーブルに適当なレコードも4件追加でき、
pgAdmin3のテーブルビューで追加したこのレコード4件を確認できました。

また、pgAdmin3のクエリツールを用いて、クエリの下記を実行すると
正常に実行してくれます。
select version();
"PostgreSQL 8.0.2 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)"

ところが、上で作成したtblBooksテーブルを含めたクエリを実行させると、
何回やっても次のようなエラーとなります。
select * from tblBooks;
ERROR: relation "tblbooks" does not exist.------(1)

pgAdmin3でなく、ツールpgSQLを使っても同じエラー(1)がでます。
この"relation does not exist"とは一体どんなエラーなんでしょうか?

環境は, Windows 2000 Server SP4 で、
template1,tblBooksは次のようになっています。

CREATE DATABASE template1
WITH OWNER = postgres
ENCODING = 'EUC_JP'
TABLESPACE = pg_default;
GRANT ALL ON DATABASE template1 TO postgres;

CREATE TABLE "tblBooks"
(
"ID" int4 NOT NULL,
"Book" text,
CONSTRAINT "key" PRIMARY KEY ("ID")
)
WITHOUT OIDS;

エラーの詳細は以下のとおりです。

まず、ダウンロード後解凍したpostgresql-8.0-ja.msiを
ダブルクリックして、Windows2000serverSP4 に
postgreSQL8.02 をインストールしました。
このときユーザpostgreも新規作成しました。

つぎに、ツールpgAdmin3を使用して上記postgreユーザで
データベースtemplate1のpublicスキームの中に、
ID(int4), Book(text)の2フィールド、IDフィールドをキーとして、
tblBooksという名称の練習用の簡単なテーブルを作成しました。

さらに、pgAdmin3を使用して、こ...続きを読む

Aベストアンサー

テーブル名に大文字と小文字が混在しているせい
でしょうか。。。
"tblbooks" か "TBLBOOKS" にしたほうがよい
とは思います。

(SQL文としては、大文字小文字どちらか一方
に統一されていれば、
"tblbooks"でCREATEしたテーブルでも、
"TBLBOOKS"でSELECTできるはずです。)

検証したわけではないので、はずしているかもしれませ
んが、CREATE TABLE "tblbooks" で作ってみても、
再現するでしょうか?

Qdate型でのbetweenについて教えてください。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01'
にすると2007-12-31が該当するのですが、
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'
では2007-12-31のレコードは該当しないものでしょうか??

select * from test where num between 10 and 100
とした場合では、num が 10 ~ 100 のものが問い合わされますよね??
date型になるとこうならないのでしょうか??

よろしくお願いします。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date...続きを読む

Aベストアンサー

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

●時間だけを多少進めたデータを追加してみました

farm=# insert into testtbl6 values('2007-12-31 01:00:00');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
2007-12-31 01:00:00
(2 rows)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '200
7-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

よって、あなたのDBに登録してあるデータは、2007-12-31と午前0時を少し回っているデータが登録されているため、
検索でヒットしないのではないのでしょうか?

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 ...続きを読む


人気Q&Aランキング