1

列を持つアプリケーションの設定を含むテーブルがあります: idkey、およびvalue

id列は自動インクリメントですが、現在は使用しておらず、外部キー制約もありません。設定を入力していて、設定をそのように配置していないため、アルファベット順に再構成したいと思いますが、アルファベット順に並べ替えると、関連する設定をグループ化するのに役立ちます。

たとえば、次の設定があるとします。

ID     KEY             VALUE
======================================
1      App.Name        MyApplication
2      Text.Title      Title of My App
3      App.Version     0.1

毎回 ORDER BY を実行しなくても、すべての App.* 設定を順番にグループ化する必要があります。とにかく、それは説明です。次のことを試しましたが、順序は変更されていないようです。

CREATE TABLE mydb.Settings2 LIKE mydb.Settings;
INSERT INTO mydb.Settings2 SELECT `key`,`value` FROM mydb.Settings ORDER BY `key` ASC;
DROP TABLE mydb.Settings;
RENAME TABLE mydb.Settings2 TO mydb.Settings;

これにより、提案どおりにテーブルの複製が作成されますが、データは再構築されません。ここで何が欠けていますか?

4

2 に答える 2

3

テーブルを並べ替える簡単な方法は、を使用することALTER TABLE table ORDER BY column ASCです。試したクエリは機能するはずでしたが、ALTERTABLEクエリが機能することはわかっています。かなりよく使います。

注:テーブル内のデータの並べ替えは、MyISAMテーブルでのみ機能し意味があります。InnoDBは常にデータをPRIMARYKEYの順序で格納するため、再配置することはできません。

于 2013-02-12T19:06:34.243 に答える
2

それを答えにすることにしました。

最初の回答へのコメントで述べたように、長期的な効果を得るには、キー列を PRIMARY KEY として設定テーブルを再作成する必要があります。G-Nugget が正しく言ったように、「InnoDB は常にデータを PRIMARY KEY 順に格納する」ためです。

あなたはこのようにすることができます

CREATE TABLE settings2
    (`id` int NULL, `key` varchar(64), `value` varchar(64), PRIMARY KEY(`key`));
INSERT INTO settings2 
SELECT id, `key`, `value` 
  FROM settings;
DROP TABLE settings;
RENAME TABLE settings2 TO settings;

そうすれば、新しいレコードを挿入した後、注文をそのまま取得できます。

idまた、テーブルの最初の列が必要ない場合は、settingsそれを捨てる良い機会です。

ここで作業中のsqlfiddleです

免責事項:個人的にはORDER BYとにかく使用します

于 2013-02-12T20:04:24.553 に答える