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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

3019閲覧

postgresqlにカラムを追加するには

pyon_kiti_jp

総合スコア251

PostgreSQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/07/07 07:00

編集2020/07/07 08:42

Rails+Postgresqlの環境です。

テーブルの任意の場所にカラムを追加したいのですが、Postgresqlの場合、afterが有効にならず、テーブルの最後のカラムの後にしかカラムが追加されないのは周知の事実だと思います。

そこで、次の手順でカラム追加をやりたいと思っています。このやり方で実現できそうでしょうか。そもそも、どのようなやり方が標準的な手順なのか教えて頂けませんでしょうか。

<手順>
1 テーブルのデータのバックアップを取る。
2 delete tableコマンドでテーブルを削除する。
3 schema.rbを触って、カラムを追加する。
4 下記コマンドでカラムが追加されたテーブルを作成する。

$rails db:schema:load

5 バックアップデータに、カラムを追加した位置にデフォルト値を更新する。
6 バックアップデータを、インポートする

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

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

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

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

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

Orlofsky

2020/07/07 07:22

>updated_atカラムの後にしか テーブルの最後のカラムの後にしか、 って修正しては?
pyon_kiti_jp

2020/07/07 07:27

ご指摘ありがとうございます。
Orlofsky

2020/07/07 08:35

ここは社内の掲示板ではないです。 >(updated_atカラム) は削りましょう。 pyon_kiti_jpさんの会社のルールがグローバルスタンダードだと思わない方が無用な誤解を避けられます。
guest

回答3

0

SQL的には、外部キーはないものとして、
・任意の位置にカラムを追加した別テーブルを用意して、
・INSERT ... SELECT ... FROM 元テーブル
・DROP 元テーブル
・別テーブルを元テーブルにRENAME
・インデックスを追加
参考

投稿2020/07/07 07:21

Orlofsky

総合スコア16415

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

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

pyon_kiti_jp

2020/07/07 07:29

ご回答ありがとうございます。なるほど、このやり方もいいですね。
guest

0

あまりDBには詳しくないですが、昔担当したシステムでそれに近いやり方でカラム追加をしていましたね。

すべての手順をスクリプトにして、テスト環境で念入りに確認してから本番環境で流す、みたいなやり方でした。その時のやり方としては

  1. テーブルデータのバックアップ(pg_dump)
  2. CREATE TABEで新しくカラムを追加したテーブルを別名で作成
  3. 旧テーブルから新テーブルへデータをコピー(新しいカラムにはデフォルト値を入れる)
  4. 旧テーブル、新テーブルともALTER TABLEでリネーム
  5. 旧テーブルをDROP TABLEで削除

こんな感じでしょうか。最近のバージョンではもっと便利な機能があるかもしれませんが、ご参考まで。

投稿2020/07/07 07:36

編集2020/07/07 07:48
KoichiSugiyama

総合スコア3041

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

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

pyon_kiti_jp

2020/07/07 07:47

ご回答ありがとうございます。 参考になりました。
guest

0

ベストアンサー

テーブルの任意の場所にカラムを追加したいのですが

なぜそれが必要なのでしょうか。「性能面でそうしないと問題が起きる」という状況なら別ですが、そうでないなら列の順序を気にすべきではありません

投稿2020/07/07 07:28

maisumakun

総合スコア145184

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

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

pyon_kiti_jp

2020/07/07 07:42

性能面で問題が起こるという事はありません。ただ、気分的な問題です。 開発の現場では、普通、気にされないものですか。
maisumakun

2020/07/07 07:46 編集

> 開発の現場では、普通、気にされないものですか。 そうですね、むしろ列順に依存するような実装のほうが不適切です。 理論的には、データベースの行は「集合」であって、列同士の間での順序という概念は存在しません。
pyon_kiti_jp

2020/07/07 07:48

ご回答ありがとうございます。 リスクを極力避けるのであれば、このやり方の方が無難だとは思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問