7月 312013
 

ひとつのテーブルのidを別の二つのテーブルからCONSTRAINTでくくりつけようとすると
このエラーがでる。

INDEX `mtm_category2` (`mtm_category_id` ASC),
CONSTRAINT `mtm_category`
    FOREIGN KEY (`mtm_category_id`)
    REFERENCES `matome`.`mtm_category` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,

ここで指定している”mtm_category”という名前がかぶっていたためだった。
これを参照するテーブルでそれぞれ違う名前にしてあげればOK

5月 172013
 

phpMyAdminでWordPressの内容を一括置換してみます。
文字列置換なので、replace()関数を使用します。

また、WordPressの本文は “XXX_posts” テーブルの “posts_content” テーブルになります。
(たとえば、wp_postsテーブル)

なので、以下のようにすることで、WordPress内の本文にある”ポテト”を”ポティトォ”に変えられます。

update wp_posts set post_content = replace(post_content, "ポテト", "ポティトォ");

phpMyAAdminでこれを実行するには、”SQL”タブを表示して表示されたフォームに上記を記載して
その右下にある「実行」ボタンを押すと実行できます。

一歩間違うとデータを消してしまうことにもなりかねないので注意が必要です。

5月 162013
 

mysqlのデータディレクトリを一旦移動すると、戻してもデータベースが
全くない状態になってしまった。

そういう時は、いったんMySQLデーモンを再起動します。

# /etc/init.d/mysqld restart

そうすると再びdatadirで設定されたディレクトリを読みに行き、
データベースが読み込まれます。

5月 152013
 

例えば、毎日の売り上げを記録した”days”というテーブルと、
祝日をの情報を持ったテーブル”holiday”があるとします。

ここで、祝日以外の日の売り上げ平均を見たい場合、
以下のようにすることで抽出できます。

SELECT AVG(sales) FROM days as d LEFT OUTER JOIN holiday as h ON d.year=h.year AND d.month=h.month AND d.day=h.day WHERE h.id IS NULL  group by d.year;
5月 082013
 

テーブル内のカラムに対し INDEX を設定すると、
そのカラムをキーに検索を行った時のパフォーマンス
の向上がはかれます。

既存のカラムにこのINDEXを設定するには以下のように
ALTER TABLEを使用します。

ALTER TABLE <テーブル名> ADD INDEX (<カラム名>);

実施例を以下に記載します。

mysql> show fields from mytest;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.03 sec)
 
mysql> ALTER TABLE mytest ADD INDEX (name);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> show fields from mytest;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  | MUL | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

INDEXが設定されたカラムには上記のように”Key”に”MUL”が設定されます。

これは”MULTI VALUE”という意味で、ユニークなキーではなく、同じ値が
あり得るキーですよ。という意味っぽいです。

そこで、このカラムにさらに UNIQUEキー を設定してみると、Keyの
値が”UNI”に代わりました。
これはユニークなキーってことですね。

mysql>
mysql> ALTER TABLE mytest ADD UNIQUE (name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> show fields from mytest;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  | UNI | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
5月 082013
 

既存のカラムを削除するには、”ALter”句を使用します。

以下のような感じで使用します。

mysql> ALTER TABLE <テーブル名> DROP <カラム名>

以下使用例です。

mysql> show fields from tmp;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| name   | varchar(100) | YES  |     | NULL    |                |
| age    | int(11)      | YES  |     | NULL    |                |
| tall   | int(11)      | YES  |     | NULL    |                |
| weight | int(11)      | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
5 rows in set (0.02 sec)
 
mysql> ALTER TABLE tmp DROP weight;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> show fields from tmp;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
| tall  | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
4月 022013
 

外部キーを持った表にレコードを挿入しようとしたら、「Cannot add or update a child row: a foreign key constraint fails」
と、でてしまった。

mysql> INSERT INTO parent(product_id,status_id,category_id,id,created_at,updated_at) VALUES('3','2','2','5','2012-04-06 21:42:38','2012-10-17 11:34:35');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`tktrac/parent`, CONSTRAINT `fk_reservation_priority` FOREIGN KEY (`priority_id`) REFERENCES `priority` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

ググってみると、存在しない親の外部キーを挿入しようとすると出るとなっているが、ここでエラーとなっている
“priority_id”には挿入しようとはしていない。
“priority_id”にはNOT NULLはつけていないけど、外部キーは値が必須なのかと思い、
“priority_id”も挿入するように変更したらうまくいった。。

mysql> INSERT INTO parent(product_id,status_id,category_id,id,priority_id,created_at,updated_at) VALUES('3','2','2','5','1', '2012-04
-06 21:42:38','2012-10-17 11:34:35');
Query OK, 1 row affected, 2 warnings (0.01 sec)

しかし、ほかにも外部キーはあり、ほかの外部キーは挿入しなくてもエラーとならない。
よくわからないので、挿入対象のテーブルをもう一度作り直したらエラーがなくなった。
なぞ。

3月 252013
 

いきなり以下のエラーがでるようになった。

mysql> show fields from parent;
ERROR 1030 (HY000): Got error 28 from storage engine

showコマンドで発生したので、なのでなかなか気づけませんでしたが、
どうやらMySQLサーバの容量がなかったのが原因だったようです。

サーバの容量を空けたらエラーはなくなりました。

3月 232013
 

テーブルの中身を空にするには、テーブルの中身をすべて削除するか、
テーブルを削除して再度作り直すという2通りの方法があります。

テーブル内のデータを削除する

mysql> delete from category;

deleteにより削除する場合はテーブル内のデータをそれぞれ削除し
テーブル自体は依然のままなので、AUTO_INCREMENT設定したidは
引き継がれます。

テーブルを削除して作り直す

mysql> truncate table category;

truncate句によりテーブルを空にする場合は、位置とテーブル自体を
削除してしまっているため、AUTO_INCREMENT設定したidはまた最初から
振りなおしになります。