当初作ったテーブル(テーブル名=test)では
col1 char(10) unique not null,
col2 text not null,
col3 text not null,
col4 text not null
だったのですが、col1だけをchar→varcharに変えたくて
alter table test modify col1 varchar(10) unique not null
としたところ、他のtext型項目が全てmidiumtextになってしまいました。

ひとつずつtextに直そうと
alter table test modify col2 text not null
を実行し次に
alter table test modify col3 text not null
とするとcol3はtextになるがcol2がまたmidiumtextになってしまいます。

midiumtextほどの容量は必要ないのでcol2~col4をtextに戻したいのですが、
どのようにすればよいのでしょうか。
ご教示願います。

宜しくお願い致します。

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

A 回答 (1件)

UNIQUEは引き継がれるはずなので、changeをつかって


以下のようにしてみてはいかがでしょうか?

ALTER TABLE `test`
CHANGE `col1` `col1` VARCHAR(10) NOT NULL
,CHANGE `col2` `col2` TEXT NOT NULL
,CHANGE `col3` `col3` TEXT NOT NULL
,CHANGE `col4` `col4` TEXT NOT NULL

ただしMySQLのバージョンにもよるでしょうけど、
暗黙のフィールド定義変更がはたらいて手動による
型変更は意味がないかもしれません

参考URL:http://www.mysql.gr.jp/Manual/mysql-4.00.12/manu …
    • good
    • 0
この回答へのお礼

ありがとうございます、できました!

お礼日時:2006/11/25 19:55

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

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

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

Qmodifyでnot nullを追加出来ない

My SQL バージョン5.5です。
学校で習っている時に
追加で、 not nullを設定しようと思い、
modify文を色々試して使いましたが Syntaxのエラーが出て、
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' c_pass not null' at line 1
(※c_pass はカラム名です)

change 型名(桁数)を使うと変更できました。
なぜmodifyなどでは追加変更出来なかったのか、原因がわかる方はいらっしゃいますか?
バージョンの問題ですか?

Aベストアンサー

#2です

>そのパターンは無理でした。

なにか読み間違えていると思いますが・・・
もしかしたら5.5でできないのでしょうか?

以下ためしてみてください。

create table hoge (id int not null,data int null);
insert into hoge values(1,100),(2,null),(3,200);
alter table hoge modify data int not null;

nullだったid=2のdataは0になるはずです

QMySQL4.1以上でのchar,varcharの定義について

環境はWindowsXP + MySQL5.0です。

MySQL5.0でテーブルを作成したところ、varchar(10)の列に入力可能なデータは『10バイト分』でななく『10文字分』でした。
(「1234567890」や「abcdefghij」に加え、「あいうえおかきくけこ」も入力可能だった)

従来(?)の『varchar(10) = 10バイト分入力可能』で定義したいのですが、なにか方法はないでしょうか?
(「1234567890」や「あいうえお」は入力可能だが、「あいうえお1」は入力不可にしたい)

http://www.mysql.gr.jp/frame/modules/bwiki/index.php?FAQ#u0cc977e
↑こちらのページによると、MySQL4.1からこのような仕様になったようですが、MySQLのバージョンは5.0のままでなにか方法はないものかと探しております。
よろしくお願いします。

Aベストアンサー

#1です。

ストアドプロシジャを使うという案も、特定の列に限って長さをチェックするというものでして、スマートではありません。

ある表のある列の定義情報(長さ)を得る方法、その退避方法といったところが問題になりそうですね。

create table t1
(c1 varchar(10) check(length(c1)<=10);

日本語では検査制約と呼ぶのかな?checkが使えないかと思ったのですが、MySQLでは「構文チェックはするが、実際に制約は働かない」という中途半端なサポート状況のようです。

QMySQLのvarchar型とtext型について

以下のURLのページを読んだのですがよく理解できません。。。
http://dev.mysql.com/doc/refman/4.1/ja/storage-requirements.html
http://dev.mysql.com/doc/refman/4.1/ja/blob.html

例えば'abc'という文字列を格納するとした場合、記憶容量は
varchar型では3+1バイト、text型では3+2バイトとなるようですが、
1バイト(varchar)と2バイト(text)の違い以外で、
text型の方がDBに負担がかかるとか不利になるようなことはありますか?

text型では格納する文字列の長さに関係無く、65535バイトを常に確保しているとか…
text型の方が動作が遅いとか…

現状、255バイト以下を想定しているのでvarchar(255)にするつもりですが、
将来的に256バイト以上となることもありえるので
最初からtext型にしていた方がいいのでしょうか?
また、将来text型に変更した際にパフォーマンスが落ちる等といったことがありえるのでしょうか?

宜しくお願い致します。

以下のURLのページを読んだのですがよく理解できません。。。
http://dev.mysql.com/doc/refman/4.1/ja/storage-requirements.html
http://dev.mysql.com/doc/refman/4.1/ja/blob.html

例えば'abc'という文字列を格納するとした場合、記憶容量は
varchar型では3+1バイト、text型では3+2バイトとなるようですが、
1バイト(varchar)と2バイト(text)の違い以外で、
text型の方がDBに負担がかかるとか不利になるようなことはありますか?

text型では格納する文字列の長さに関係無く、65535バイトを常に確保...続きを読む

Aベストアンサー

#1です。

そういえば部分インデックスがありましたね。
使ったことないので忘れてました。失礼しました。
私見でもうしわけないですが部分インデックスは若干
運用方法も気をつける必要がありそうなので、
微妙な気がします。

とりあえず#1の私の回答は参考にならなかったような
ので、あとは誰か別の人にきいてください

Qtext型とuniqueについて

mysqlでテーブル作成したいのですが
l_urlのtext型のuniqueは、どうやって作成したらいいのでしょうか?
後、テーブル作成を実際すると結構つまずくので練習したいのですが
何かいい勉強方法はありますか?

/* リンクデータ用テーブル作成
CREATE TABLE linkdata (
id int NOT NULL auto_increment,
l_url text NOT NULL unique,
l_title varchar(100) NOT NULL default '',
l_comment varchar(255) default NULL,
l_date datetime default NULL,
PRIMARY KEY (id)
);

実行結果:
ERROR 1170 (42000): BLOB/TEXT column 'l_url' used in key specification without a key length
mysql>

mysqlでテーブル作成したいのですが
l_urlのtext型のuniqueは、どうやって作成したらいいのでしょうか?
後、テーブル作成を実際すると結構つまずくので練習したいのですが
何かいい勉強方法はありますか?

/* リンクデータ用テーブル作成
CREATE TABLE linkdata (
id int NOT NULL auto_increment,
l_url text NOT NULL unique,
l_title varchar(100) NOT NULL default '',
l_comment varchar(255) default NULL,
l_date datetime default NULL,
PRIMARY KEY (id...続きを読む

Aベストアンサー

text型を使うのは、なるべく避けましょう。
長さの上限を予め決められるものは、varcharを使い、長さの上限は可能か限り短くしましょう。

text型は事前に長さの上限が決められないような場合に使いますが、物理的に複数のレコードに格納されたりするので、高い性能は出せません。また、text型を実装している多くのRDBMSでは、text型に対する操作に制限が設けれています。

>l_urlのtext型のuniqueは、どうやって作成したらいいのでしょうか?

text型に格納するようなものに、unique制約をつけようとすること自体、設計に問題があるのですけどね。

>ERROR 1170 (42000): BLOB/TEXT column 'l_url' used in key specification without a key length

エラーメッセージの通りです。
MySQLではtext型を実装していますが、当初は定義や操作に多くの制限がありました。どのバージョンだったか忘れましたが、制限が一部緩和され、unque指定で「制約の対象にする長さ」を指定することが可能になりました。

text型を使うのは、なるべく避けましょう。
長さの上限を予め決められるものは、varcharを使い、長さの上限は可能か限り短くしましょう。

text型は事前に長さの上限が決められないような場合に使いますが、物理的に複数のレコードに格納されたりするので、高い性能は出せません。また、text型を実装している多くのRDBMSでは、text型に対する操作に制限が設けれています。

>l_urlのtext型のuniqueは、どうやって作成したらいいのでしょうか?

text型に格納するようなものに、unique制約をつけようとする...続きを読む

Q「VARCHAR(255)」を「text」に。種別変更

MySQL 4.0.27を利用しております。
操作はphpMyAdminで行っております。

1つの項目がかなりの文字数になりつつあり、
VARCHAR(255)では、入りきらないデータがでてきました。
そこで「VARCHAR(255)」を「text」に変更しようと
思います。

この時、データが入ったまま種別変更を行っても
データが消えたりすることはないでしょうか?

もしよければ「text」にした場合のデメリットも
お教えください。よろしくお願いします。

Aベストアンサー

>「text」にした場合のデメリットも

ほとんどの場合、TEXT型のカラムは、任意の長さに設定できるVARCHAR型
という認識でよいそうです。

参考URL:http://dev.mysql.com/doc/refman/4.1/ja/blob.html


人気Q&Aランキング

おすすめ情報