データを失うことなくSQLデータベースの列のデータ型を変更する方法


198

SQL Serverデータベースがあり、列の1つの型をからintに変更できることに気づきましたbool

そのテーブルに既に入力されているデータを失うことなく、どうすればよいですか?


3
新しいビット列を作成し、古い列から新しい列に値をコピーし、古い列を削除し、新しい列の名前を変更してみましたか?もちろん、これらすべてをトランザクション内で実行して、問題をロールバックします。
Radu Caprescu、2011

2
「列の1つからint型からbool型に変更できることに気付いた」と言うと、ブール型のデータ型はありません。少しありますが。あなたはどのように求めているあなたは(2つの答えはこれまでカバーしてきたように)これを行うことができます。または、「これが可能であることに気づきました-SQL Serverはこれをどのように行うのですか?」
マーティン・スミス

回答:


329

これは、次のコマンドを使用して簡単に実行できます。0の値は0(BIT = false)に変換され、それ以外の値は1(BIT = true)に変換されます。

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

もう1つのオプションは、タイプの新しい列を作成BITし、古い列から入力します。完了したら、古い列をドロップし、新しい列の名前を古い名前に変更します。そうすれば、変換中に何か問題が発生した場合でも、すべてのデータが残っているため、いつでも元に戻すことができます。


10
言い換えれば、NULL遺骨NULL0なりFalse、非ゼロ値(1、-1、1999、-987は、...)になりますTrue
アルバロ・ゴンサレス

2
また、GUIからこのような変更を行わないでください。常に次のようなスクリプトで作成してください。GUIはテーブルを削除して再作成しますが、これにはかなり時間がかかります。テーブルが大きく、稼働中の場合、これは悲惨な結果になる可能性があります。さらに、すべてのテーブル変更には、他のすべてのコードと同様に、ソース管理にあるスクリプトが必要です。
HLGEM 2017

1
データを含むテーブルに構造上の変更を加える前に、データベースの現在のバックアップがあることを確認してください。また、テーブルが頻繁に使用されている場合やテーブルが大きい場合は、ピーク使用時間中に本番環境でこのような変更を実行しないでください。
HLGEM 2017

私は編集を誤って承認しました...拒否する必要があります..そこに改善がないため... Ansは完璧です。
Vikash Pathak

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

注:列のサイズがある場合は、そのサイズも記入してください。


20

有効な変更である場合。

プロパティを変更できます。

ツール->オプション->デザイナ->テーブルおよびデータベースデザイナ->チェックボックスをオフ->テーブルの再作成を必要とする変更を保存しないようにします。

これで、テーブルを再作成したり、urレコードを失うことなく、列名を簡単に変更できます。


5
GUIを使用してテーブルを変更してはなりません。テーブルを変更するのではなく、テーブルを完全に再作成します。これをオフにすると、テーブルが大きい場合に問題が発生します。さらに、ソース管理のスクリプトのテーブルにすべての変更を加える必要があります。
HLGEM 2017

そのオプションをより詳細に見てください-安全性がオフになり、GUIがテーブルをドロップできなくなります。GUIがテーブルを再作成するため、データが失われたようには見えません、サーバー上ではコピー/ドロップされます。そのため、テーブルに大量のデータがある場合、非常に大きな操作が発生します。また、私は考えるので、あなたのトランザクションログを埋めることができ、それが単一のトランザクションで発生していること(ポジティブではありません)。
JMarsch 2017年

1
以前のコメントに少し説明を加えたいと思います。開発マシンでこれを実行しているだけであれば、おそらく問題ありません。ただし、この方法を運用データベースで使用することはお勧めしません。特に、ミッションクリティカルなデータベースの場合はそうです。
JMarsch 2017年

8

なぜデータを失うと思いますか?Management Studioに移動して、データ型を変更するだけです。既存の値をブール(ビット)に変換できる場合は、それを行います。つまり、元のフィールドで「1」がtrueにマップされ、「0」がfalseにマップされている場合は問題ありません。


1
テーブルにデータがある場合、これは機能しません。列の種類を変更しようとすると、SMSは最初にテーブルを削除する必要があると主張します...もちろん、ALTER TABLE ... ALTER COLUMNコマンドはNULL以外のフィールドでも問題なく機能するため、これは正しくありません。これが、データを失う可能性があると考えた理由です。
Tony O'Hagan、2015

1
@ TonyO'Haganそれは真実ではありません。警告をオフにすると、既存のデータで問題なく機能します。stackoverflow.com/questions/2947865/…
Philippe Leybaert 2015

1
うんいいね!それを知りませんでした。あなたに賛成票を投じようとしただけですが(バック)、回答を編集しない限り、SOが私を妨げています。たぶんマイナーな変更と私はそうすることができます;)。
Tony O'Hagan、

1
GUIを使用してテーブルを変更してはなりません。テーブルを変更するのではなく、テーブルを完全に再作成します。これをオフにすると、テーブルが大きい場合に問題が発生します。さらに、ソース管理のスクリプトのテーブルにすべての変更を加える必要があります。
HLGEM 2017

いかなる状況でも、テーブルを設計したり変更したりするためにGUIを使用する理由はなく、それを行わない正当な理由もあります。すべての変更は、他のサーバーに伝播し、実際にソース管理にあるコードのように処理できるようにするために、スクリプトに含める必要があります。
HLGEM 2017

5

T-SQL(MSSQL)を使用する場合。このスクリプトを試してみてください:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

MySQLを使用する場合。このスクリプトを試してみてください:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

Oracleを使用する場合。このスクリプトを試してみてください:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

ツール-オプション-デザイナ-テーブルおよびデータベースデザイナに移動し、[保存を禁止する]オプションをオフにします。ここに画像の説明を入力してください


1
GUIを使用してテーブルを変更してはなりません。テーブルを変更するのではなく、テーブルを完全に再作成します。これをオフにすると、テーブルが大きい場合に問題が発生します。さらに、ソース管理のスクリプトのテーブルにすべての変更を加える必要があります。
HLGEM 2017

2

列のチェックタイプを列のデータタイプに変更します。

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

私にとって、SQL Server 2016では、私はこのようにします

*列Column1の名前をcolumn2に変更するには

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

*列のタイプを文字列から整数に変更するには:( データの形式が正しいことを確認してください

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

コンパクトエディションでは、日時データ型(8)のサイズが自動的に取得されるため、フィールドのサイズを設定してこの操作でエラーを生成する必要はありません...


-2

次のクエリを使用して、テーブルフィールドのデータ型を変更できます。また、Oracle DBでも、

ALTER TABLE table_name
MODIFY column_name datatype;

SQL Serverにない
HLGEM 2017

-4

データを失うことなくデータ型を置き換える

alter table tablename modify columnn  newdatatype(size);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.