質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

3回答

3326閲覧

postgresql create table 上書き

ttoo

総合スコア126

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/02/01 05:33

編集2020/02/01 05:46

SQL初心者です。

ファイル名:ssql2-List08_04

CREATE TABLE 費目 ( ID INTEGER, 名前 VARCHAR(20), 備考 VARCHAR(100) ); INSERT INTO 費目 ( ID,名前,備考 ) VALUES ( 1,'給料','給与や賞与が入った' );INSERT INTO 費目 ( ID,名前,備考 ) VALUES ( 2,'食費','食事代(ただし飲み会などの外食を除く)' );INSERT INTO 費目 ( ID,名前,備考 ) VALUES ( 3,'水道光熱費','水道代・電気代・ガス 代' );

上記postgresqlで実行すると下記のようなテーブルが作成されます。

postgres=> \i ssql2-List08_04 CREATE TABLE INSERT 0 1 INSERT 0 1 INSERT 0 1 postgres=> select * from 費目; id | 名前 | 備考 ----+------------+---------------------------------------- 1 | 給料 | 給与や賞与が入った 2 | 食費 | 食事代(ただし飲み会などの外食を除く) 3 | 水道光熱費 | 水道代・電気代・ガス代 (3 rows) postgres=>

その後もう一度、同じファイルを実行すると、

postgres=> \i ssql2-List08_04 psql:ssql2-List08_04:1: ERROR: relation "費目" already exists INSERT 0 1 INSERT 0 1 INSERT 0 1 postgres=> select * from 費目; id | 名前 | 備考 ----+------------+---------------------------------------- 1 | 給料 | 給与や賞与が入った 2 | 食費 | 食事代(ただし飲み会などの外食を除く) 3 | 水道光熱費 | 水道代・電気代・ガス代 1 | 給料 | 給与や賞与が入った 2 | 食費 | 食事代(ただし飲み会などの外食を除く) 3 | 水道光熱費 | 水道代・電気代・ガス代 (6 rows) postgres=>

このように行に結合される形で出力されます。

上記ファイルを実行するときに、結合されるのではなく上書きを行いたいとき、
どのような対応方法がございますでしょうか?

versionは
PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit

Amazon Linux AMI release 2018.03
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

そもそもIDがPrimaryKeyになっていない時点で設計がおかしいと思いますけど、
SQL直実行でINSERTしか書いてないので、そもそもの作りをかえたほうが良いと思います。
値とINSERTかUPDATEか引数で指定するとか。
いずれにしても直にSQL実行する仕組みにならないと思います(SQLだけでアプリケーションとすることってあまりないですし)。

投稿2020/02/01 05:41

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

そのテーブルに一意キーを設定すれば、INSERT ~ ON CONFLICT DO UPDATE ・・・で一意キーが存在しているものを上書き(UPDATE)してくれます。
INSERT
PostgreSQL 9.5の新機能CONFLICT(UPSERT)を使ってみた。

投稿2020/02/01 06:03

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQL

1CREATE TABLE IF NOT EXISTS 費目 ( 2 ID INTEGER, 3 名前 VARCHAR(20), 4 備考 VARCHAR(100), 5 PRIMERY KEY (id) 6); 7 8INSERT INTO 費目 ( ID,名前,備考 ) VALUES ( 1,'給料','給与や賞与が入った' ) 9ON CONFLICT (ID) DO UPDATE SET 名前 = '給料', 備考 = '給与や賞与が入った' WHERE ID = 1; 10 11INSERT INTO 費目 ( ID,名前,備考 ) VALUES ( 2,'食費','食事代(ただし飲み会などの外食を除く)' ) 12ON CONFLICT (ID) DO UPDATE SET 名前 = '食費', 備考 = '食事代(ただし飲み会などの外食を除く)' WHERE ID = 2; 13 14INSERT INTO 費目 ( ID,名前,備考 ) VALUES ( 3,'水道光熱費','水道代・電気代・ガス 代' ) 15ON CONFLICT (ID) DO UPDATE SET 名前 = '水道光熱費', 備考 = '水道代・電気代・ガス 代' WHERE ID = 3; 16

とか。(机上のコードだけども。)

投稿2020/02/01 06:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問