タグ付けされた質問 「alter-table」

既存のテーブルオブジェクトを変更するために使用されるSQLステートメント。

3
単一のコマンドでデータベース内のすべてのテーブルを変更する
データベース内のすべてのテーブルを変更する単一または1行のコマンドはありますか。データベース内のすべてのテーブルでこのコマンドを発行したいと思います。 ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8; 私の目的は、すべてのテーブルの文字セットをlatin1からutf8に変更することです。 更新: RDBMSはMySQLです

3
大きなテーブルの列をNON NULLに変更する速度を上げる
最近、5億行に近いテーブルにNULL可能ビット列を追加しました。列にはデフォルトはありませんが、すべての挿入で0または1の値が指定されています。1回限りのルーチンを実行して、既存のすべての行に0または1を割り当てます(小さなバッチで行を更新します)。これで、すべての行の列に0または1が表示されます。 ビット列をnull不可にしたいのですがALTER TABLE t1 ALTER COLUMN c1 bit not null、で実行しようとしたときに3分実行され、テーブルへのすべての読み取りをブロックしていたため停止しましたが、完了するまでに時間がかかると思われました。それほど時間がかからない可能性はありますが、利用できないリスクを冒すことはできません。ロールバック自体は6分かかりました。 完了するまでに何時間もかかることなく、列をnull不可にする方法について提案はありますか? さらに、ALTER TABLE ALTER COLUMN開始してからキャンセルしたステートメントが完了するまでにかかる時間を見積もる方法はありますか? SQL Server 2017 Web Editionを使用しています。

4
列NVARCHAR(4000)からNVARCHAR(260)への高速変更
いくつかのNVARCHAR(4000)列でこのテーブルを処理する非常に大きなメモリ許可でパフォーマンスの問題があります。これらの列はより大きいことはありませんNVARCHAR(260)。 を使用して ALTER TABLE [table] ALTER COLUMN [col] NVARCHAR(260) NULL SQL Serverはテーブル全体を書き換えます(ログスペースで2倍のテーブルサイズを使用します)。これは何十億行で、何も変更しないだけで、オプションではありません。列の幅を大きくしてもこの問題はありませんが、小さくすると問題が発生します。 制約を作成しようとしたCHECK (DATALENGTH([col]) <= 520)かCHECK (LEN([col]) <= 260)、SQL Serverがテーブル全体を書き直すことにしました。 列のデータ型をメタデータのみの操作として変更する方法はありますか?テーブル全体を書き換える費用なしで?SQL Server 2017(14.0.2027.2および14.0.3192.2)を使用しています。 以下は、再現に使用するサンプルDDLテーブルです。 CREATE TABLE [table]( id INT IDENTITY(1,1) NOT NULL, [col] NVARCHAR(4000) NULL, CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED (id ASC) ); そして、を実行しALTERます。

2
600GBテーブルのインデックス付きキーデータ型をINTからBIGINTに変更する最速の方法
600GB MySQLテーブルでデータ型をINTからBIGINTに変更する必要があります。列には一意のインデックスがあります。私は無署名のINTで良いかもしれませんが、それを変更するか、BIGINTを変更することはほとんど同じ痛みだと思います。テーブルのエンジンはInnoDBです。簡単になるもの: 他の机 構造のコピーと INSERT INTO (SELECT *) テーブルのダンプとダンプファイルテーブル定義の変更 他に何か? 更新:要求どおり、MySQLバージョン5.5.15、外部キーなし、テーブル作成: CREATE TABLE `tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `created_at` datetime NOT NULL, `tid` bigint(20) NOT NULL, `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `f` tinyint(1) NOT NULL, `i_id` bigint(20) NOT NULL, `ir_id` …

4
列の制約(インデックス)の削除
インデックスがあるテーブルのタイプを変更するにはどうすればよいですか?空のテーブルで列を変更して型を日付時刻からvarchar(15)に変更しようとしましたが、列(インデックスであることが判明)に依存しているというエラーが表示されました。 インデックスを右クリックしてドロップをスクリプト化することで、これをローカルで簡単に回避できましたが、インデックス名にアクセスできない他のサーバーでこれを展開する必要があります。 インデックスを削除するスクリプトを作成する方法はありますか?列でそのデータ型を変更してからインデックスを読み取ることができますか?ありがとう!

5
MySQL-InnoDBのALTER TABLEへの最速の方法
変更したいInnoDBテーブルがあります。テーブルには約8,000万行あり、いくつかのインデックスを終了します。 列の1つの名前を変更し、さらにいくつかのインデックスを追加したいと思います。 それを行う最速の方法は何ですか? 「プレーン」alter table、最速のソリューションですか? この時点で、私が気にしているのは速度です:)

2
1つのクエリでMySQL ENUMカラムの値の名前を変更できますか?
を含むデータベーステーブルがあるとしENUM('value_one','value_two')ます。それをに変更したいENUM('First value','Second value')。私は現在次のようにしています: ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value'); UPDATE `table` SET `column`='First Value' WHERE `column`='value_one'; UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two'; ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value'); これを行うためのより効率的な方法はありますか?EGはこれを単一の ALTER TABLEステートメントで達成する方法 ですか?

2
NULL列をNOT NULLにすばやく変更する
何百万もの行とNULL値を許可する列を持つテーブルがあります。ただし、現在、その列にNULL値を持つ行はありません(クエリでこれをかなり迅速に確認できます)。ただし、コマンドを実行すると ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL; クエリは比較的長い時間かかります。実際には10〜20分かかり、チェック制約を追加する場合の2倍以上の時間がかかります。特にその列にNULL値を持つ行がないことを知っているので、その列のテーブルのメタデータを即座に更新する方法はありますか?

1
ALTER TABLE…DROP COLUMNは本当にメタデータのみの操作ですか?
ALTER TABLE ... DROP COLUMNはメタデータのみの操作であることを示すソースがいくつか見つかりました。 ソース どうすればいいの?DROP COLUMN中のデータは、基になる非クラスター化インデックスおよびクラスター化インデックス/ヒープから削除する必要はありませんか? さらに、Microsoft Docsは、それが完全にログに記録された操作であることを示唆しているのはなぜですか? テーブルに加えられた変更はログに記録され、完全に回復可能です。列の削除や、SQL Serverの一部のエディションでは、デフォルト値でNOT NULL列を追加するなど、大きなテーブルのすべての行に影響を与える変更は、完了して多くのログレコードを生成するのに長い時間がかかる場合があります。これらのALTER TABLEステートメントは、多くの行に影響するINSERT、UPDATE、またはDELETEステートメントと同じように注意して実行してください。 副次的な質問として:データが基になるページから削除されない場合、エンジンはどのようにドロップされた列を追跡しますか?

1
nullable列をテーブルに追加すると10分以上かかる
テーブルに新しい列を追加するのに問題があります。 数回実行しようとしましたが、10分以上実行した後、ロック時間のためクエリをキャンセルすることにしました。 ALTER TABLE mytable ADD mycolumn VARCHAR(50); 有用な情報: PostgreSQLバージョン:9.1 行数:〜250K 列の数:38 null許容列の数:32 制約の数:5(1 PK、3 FK、1 UNIQUE) インデックスの数:1 OSタイプ:Debian Squeeze 64 (HeapTupleHeaderを介して)PostgreSQLがnull許容列を管理する方法に関する興味深い情報を見つけました。 私の最初の推測は、このテーブルには既に8ビットの32個のnull許容列があるためMAXALIGN、HeapTupleHeaderは4バイトの長さです(検証されていません。その方法がわかりません)。 したがって、新しいnull可能列を追加するには、新しい8ビットを追加するために、すべての行でHeapTupleHeaderを更新する必要があり、MAXALIGNパフォーマンスの問題を引き起こす可能性があります。 そこで、null許容列の数を31に減らすために、null許容列の1つ(実際には実際にはnull許容ではありません)を変更して、私の推測が正しいかどうかを確認しようとしました。 ALTER TABLE mytable ALTER myothercolumn SET NOT NULL; 残念ながら、この変更には5分以上の非常に長い時間がかかるため、中止しました。 このパフォーマンスコストが発生する原因は何か考えていますか?

4
外部キー制約を含む列を既存のテーブルに追加する方法は?
次の表があります。 CREATE TABLE users (id int PRIMARY KEY); -- already exists with data CREATE TABLE message (); messagesテーブルをどのように変更しますか? という新しい列senderが追加されます テーブルをsender参照する外部キーはどこusersですか これはうまくいきませんでした # ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users; ERROR: column "sender" referenced in foreign key constraint does not exist このステートメントは列も作成しませんか?

1
列の長さを変更(縮小)するとどうなりますか?
タイプNUMBER(精度とスケールなし)との2つの列があるとしVARCHAR(300)ます。私はそれらを変更したいので、これらの列は私のデータに対して大きすぎる方法であることを見たNUMBER(11)とVARCHAR(10)。したがって、次のSQLステートメントを実行すると、 ALTER TABLE FOO MODIFY(BAR NUMBER(10)); 空でない列でそれを行うことはできますか? もしそうなら、何よりも1つの値がある場合NUMBER(10)、オラクルはそれについて教えてくれますか? 以前に定義されている場合、列のデフォルト値は変更されないままですか? 列のNULL可能オプションは変更されませんか? その列の主キー、外部キー、一意キーは変更されませんか? その列を含む制約は変更されませんか? その列のインデックスは変更されませんか? 私の質問に答える公式文書はありますか?

2
ロックを待機しているPostgreSQLのALTER TABLEクエリをキャンセルしても安全ですか?
ALTER TABLE数時間前にクエリを開始しましたpg_stat_activityが、ロックを待機していることが(を介して)最近認識されました。変更したいテーブルをロックしていて、それを手放さない他のクエリを発見しました。 このクエリは(列のデータ型を変更する)「単純な」クエリですが、大規模なテーブルで実行されています。 ロックを保持しているプロセスを強制終了するのではなく、を強制終了することにしましたALTER TABLE。 トランザクションでラップしませんでしたALTER TABLE。 私の理解する限り、クエリがロックを待機しているという事実は、常にロックを待機していて、何も変更していないことを意味します。 これは本当ですか?ALTER TABLEクエリを完全にキャンセルしても安全ですか?または、クエリがすでに何かを変更していて、それをキャンセルすると、データベースが何らかの中間状態になる可能性がありますか? PS:を使用してキャンセルする予定ですSELECT pg_cancel_backend(pid);。これが悪い考えであるなら、私に知らせてください。

2
PostgreSQLはNULL以外のDEFAULTを含む列の追加を最適化しますか?
値をNOT NULL持つ列を追加するDEFAULT場合-PostgreSQLはこの操作を最適化しますか? テーブルにn行がある場合、最適化されていないalter-table-add-columnは、デフォルト値のn回の書き込みを生成します。最適化により、DBは即座に新しい列を作成し、適切なインデックスデータ構造でその列の非デフォルト値が見つからない場合に返されるデフォルト値のコピーを1つだけ保存します。 たとえば、Oracle 11gにはそのような最適化があります。

3
SQLは列に許可された値を設定
ALTER TABLE新しい列を追加してデフォルト値を設定し、さらにその列に許可される値を定義する式を作成したいと思います。これはテキスト列であり、許可されているのは「value1」、「value2」、および「value3」のみです。デフォルトは 'value1'である必要があります 以下の構文図によると: 私はここまで来ています ALTER TABLE exampleTable ADD COLUMN new_column VarChar(20) DEFAULT 'value1' しかし、私は許可された値を設定する方法が絶対にわかりません。 何かのように作ることは可能ですか CONSTRAINT CHECK new_column IN( '値1'、 '値2'、 '値3) ?search conditionダイアグラムは私をかなり混乱させることを認めなければなりません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.