- 投稿日:2020-08-17T21:49:27+09:00
【PHPでECサイト】
- 投稿日:2020-08-17T21:45:02+09:00
【MySQL5.7】MySQLが、思うように立ち上がらない。。。
環境
$ mysql --version mysql Ver 14.14 Distrib 5.7.29, for osx10.15 (x86_64) using EditLine wrapperPIDファイルに関してのエラー
$ mysql.server start ERROR! The server quit without updating PID file (/usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid).マシンのホスト名を確認
$ uname -n hogehogenoMacBook-Pro.localpidファイルを作成し、アクセス権限を付与
$ sudo touch /usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid # /usr/local/var/mysql/配下のファイルにアクセス権限を付与する $ sudo chown -R _mysql:_mysql /usr/local/var/mysql/もう一度、MySQLを起動する
$ mysql.server start Starting MySQL . SUCCESS!それでも、エラーになる場合
ERROR! The server quit without updating PID file (/usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid).プロセス関連のエラー
mysqldのプロセスが既に起動していたら、プロセスIDを指定してkillする
$ ps -ef | grep mysql 0 1435 1 0 3:46PM ?? 0:00.02 /bin/sh/usr/local/Cellar/mysql@5.7/5.7.29/bin/mysqld_safe 74 1531 1 0 3:46PM ?? 0:08.23 /usr/local/Cellar/mysql@5.7/5.7.29/bin/mysqld $ sudo kill -9 1435 $ sudo kill -9 1531もう一度、pidファイルを作成し権限を与え、起動する
$ sudo touch /usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid $ sudo chown -R _mysql:_mysql /usr/local/var/mysql/ $ mysql.server start Starting MySQL . SUCCESS!
- 投稿日:2020-08-17T19:12:36+09:00
FuelPHP・SQL で where句 と or_where句 を同時に使うとき
はじめに
selectするときに、whereとor_whereを同時に使うときは注意しないと思っているようなクエリが発行されません。これは、論理演算子に優先順位が設定されているためです。(orよりandの方が優先順位が高いため)
https://dev.mysql.com/doc/refman/5.6/ja/operator-precedence.htmlどういったクエリが発行されるか見ていきたいと思います。
また、whereはand_whereと書くこともありますが、今回はwhere、or_whereで統一します。環境
PHP 5.3.29
FuelPHP 1.7.3
MySQL 5.5.61本題
まずはor_whereから。
sample1.phppublic static function sample1() { $query = \DB::select() ->from('table_name') ->or_where('column1', '=', 0)//条件1 ->or_where('column2', '=', 0)//条件2 ->execute() return $query; }この場合はおそらくイメージ通り
条件1または条件2
となります。
ではここにwhere句を入れるとどうなるか。sample2.phppublic static function sample2() { $query = \DB::select() ->from('table_name') ->or_where('column1', '=', 0)//条件1 ->or_where('column2', '=', 0)//条件2 ->where('column3', '=', 0)//条件3 ->execute() return $query; }こうすると発行されるクエリは、
条件1または(条件2かつ条件3)
となり、後半に書かれたwhere句の処理が優先されます。
(条件1または条件2)かつ条件3
としたい場合は、sample3.phppublic static function sample3() { $query = \DB::select() ->from('table_name') ->where_open() ->or_where('column1', '=', 0)//条件1 ->or_where('column2', '=', 0)//条件2 ->where_close() ->where('column3', '=', 0)//条件3 ->execute() return $query; }という書き方をする必要があります。同様に、
または
のくくりを大きくしたい場合はor_where_open(),close()
というものが使えます。
- 投稿日:2020-08-17T18:47:20+09:00
MySQL⑦ 使用できる値を制限する
使用できる値を制限する
1つだけ選択できる enum
カラムを作成する カラム名 enum(値①, 値②, 値③)
create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float,
rank enum('gold', 'silver', 'bronze')
);値を入力
insert into users (name, score, rank) values ('taguchi', 5.8, 'silver');
insert into users (name, score, rank) values ('fkoji', 8.2, 'gold');
insert into users (name, score, rank) values ('dotinstall', 6.1, 'red'); <- これはrankの値は保存されない内部的に値に1番スタートの連番が振られている
enum(①, ②, ③)
select * from users where rank = 'silver';
select * from users where rank = 2;上記は同じ意味になる
複数選択できる set
カラムを作成する カラム名 set(値①, 値②, 値③)
create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float,
rank set('gold', 'silver', 'bronze')
);値を入力
insert into users (name, score, rank) values ('taguchi', 5.8, 'silver, gold');
insert into users (name, score, rank) values ('fkoji', 8.2, 'gold, bronze');
insert into users (name, score, rank) values ('dotinstall', 6.1, 'red'); <- これはrankの値は保存されない内部的に値に番号が振られている
enum(2の0条, 2の1条, 2の4条)
select * from users where rank = 'gold,silver';
select * from users where rank = 3; <- これは、2の0条の1 と 2の1条の2 を足した数上記は同じ意味になる
- 投稿日:2020-08-17T18:37:14+09:00
sqlで直接DBを更新をしないといけない時はトランザクションをかける
mysqlの場合
BEGIN; # 何かしらの更新処理 update users set password = "hogehoge" where id = xx; COMMIT; # or rollback
- 更新処理を流した時に更新された件数が意図した件数かを確認してから
COMMIT
するQuery OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
- 処理を取りやめたい(戻したい時は)
rollback
で戻せる
- 投稿日:2020-08-17T18:20:29+09:00
【PHPでECサイト③】カート機能
はじめに
今回は、カート機能を実装していきます。
※当ページは、【PHPでECサイト】で作られたものを前提にしています。バージョン
PHP:7.4.5
phpMyAdmin:5.0.2
MySQL:5.7.30今回作成するファイル
html
- index.php
- index_add_cart.php
- cart.php
- cart_delete.php
- finish.phpmodel
- carts.phpview
- index_view.php
- cart_view.php
- finish_view.phpテーブルの作成
sample_cartsCREATE TABLE `sample_carts` ( `cart_id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `item_id` int(11) NOT NULL, `amount` int(11) NOT NULL, `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `sample_carts` MODIFY `cart_id` int(11) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`cart_id`), ADD KEY `item_id` (`item_id`), ADD KEY `user_id` (`user_id`);定義
const.phpdefine('INDEX_URL', '/index.php'); define('CART_URL', '/cart.php'); define('FINISH_URL', '/finish.php');Viewの作成
index_view.php<!DOCTYPE html> <html lang="ja"> <head> <meta chartset="UTF-8"> <title>商品一覧</title> </head> <body> <h1>商品一覧</h1> <p>ようこそ、<?php print($user['user_name']); ?>さん。</p> <a href="<?php print(ADMIN_URL);?>">商品管理</a> <a href="<?php print(CART_URL);?>">カート</a> <a href="<?php print(LOGOUT_URL);?>">ログアウト</a> <!-- メッセージ・エラーメッセージ --> <?php include VIEW_PATH . 'templates/messages.php'; ?> <!-- 商品一覧 --> <?php foreach($items as $item){ ?> <div> <?php print($item['name']); ?> <?php print($item['price']); ?> <!-- 売り切れの場合は、formを置換 --> <?php if($item['stock'] > 0){ ?> <form method="post" action="index_add_cart.php"> <input type="submit" value="カートに追加"> <input type="hidden" name="item_id" value="<?php print($item['item_id']) ?>"> </form> <?php }else{ ?> <p>現在、売り切れです。</p> <?php } ?> </div> <?php } ?> </body> </html>cart_view.php<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>カート</title> </head> <body> <h1>商品一覧</h1> <p>ようこそ、<?php print($user['user_name']); ?>さん。</p> <a href="<?php print(ADMIN_URL);?>">商品管理</a> <a href="<?php print(INDEX_URL);?>">商品一覧</a> <a href="<?php print(LOGOUT_URL);?>">ログアウト</a> <!-- メッセージ・エラーメッセージ --> <?php include VIEW_PATH . 'templates/messages.php'; ?> <!-- カート一覧 --> <?php if(count($carts) > 0){ ?> <table> <thead> <tr> <th>商品名</th> <th>価格</th> <th>数量</th> <th>小計</th> <th>操作</th> </tr> </thead> <tbody> <?php foreach($carts as $cart){ ?> <tr> <td><?php print($cart['name']); ?></td> <td><?php print($cart['price']); ?></td> <td><?php print($cart['amount']); ?></td> <td><?php print($cart['price'] * $cart['amount']); ?></td> <td> <form method="post" action="cart_delete.php"> <input type="submit" value="削除"> <input type="hidden" name="cart_id" value="<?php print($cart['cart_id']); ?>"> </form> </td> </tr> <?php } ?> </tbody> </table> <p>合計金額:<?php print($total_price); ?></p> <form method="post" action="finish.php"> <input type="submit" value="購入する"> </form> <?php }else{ ?> <p>カートに商品はありません。</p> <?php } ?> </body> </html>finish_view.php<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ご購入ありがとうございました!</title> </head> <body> <h1>ご購入ありがとうございました!</h1> <!-- メッセージ・エラーメッセージ --> <?php include VIEW_PATH . 'templates/messages.php'; ?> <!-- 購入した商品 --> <?php if(count($carts) > 0){ ?> <table> <thead> <tr> <th>商品名</th> <th>価格</th> <th>購入数</th> <th>小計</th> </tr> </thead> <tbody> <?php foreach($carts as $cart){ ?> <tr> <td><?php print($cart['name']); ?></td> <td><?php print($cart['price']); ?></td> <td><?php print($cart['amount']); ?></td> <td><?php print($cart['price'] * $cart['amount']); ?></td> </tr> <?php } ?> </tbody> </table> <p>合計金額:<?php print($total_price); ?></p> <?php }else{ ?> <p>カートに商品はありません。</p> <?php } ?> </body> </html>カートに追加
Model
carts.php<?php require_once MODEL_PATH . 'functions.php'; require_once MODEL_PATH . 'db.php'; // カートに追加するために必要なデータ function get_user_cart($db, $user_id, $item_id){ $sql = " SELECT sample_items.item_id, sample_items.name, sample_items.price, sample_items.stock, sample_carts.cart_id, sample_carts.user_id, sample_carts.amount FROM sample_carts JOIN sample_items ON sample_carts.item_id = sample_items.item_id WHERE sample_carts.user_id = ? AND sample_items.item_id = ? "; return fetch_query($db, $sql, array($user_id, $item_id)); } // カートに追加(既に同じ商品があれば、個数のみUpdate) function add_cart($db, $user_id, $item_id ) { $cart = get_user_cart($db, $user_id, $item_id); if($cart === false){ return insert_cart($db, $user_id, $item_id); } return update_cart_amount($db, $cart['cart_id'], $cart['amount'] + 1); } function insert_cart($db, $user_id, $item_id, $amount = 1){ $sql = " INSERT INTO sample_carts( item_id, user_id, amount ) VALUES(?,?,?) "; return execute_query($db, $sql, array($item_id, $user_id, $amount)); } function update_cart_amount($db, $cart_id, $amount){ $sql = " UPDATE sample_carts SET amount = ? WHERE cart_id = ? LIMIT 1 "; return execute_query($db, $sql, array($amount, $cart_id)); }Controller
index.php<?php require_once '../conf/const.php'; require_once MODEL_PATH. 'functions.php'; require_once MODEL_PATH. 'users.php'; require_once MODEL_PATH. 'items.php'; session_start(); if(is_logined() === false){ redirect_to(LOGIN_URL); } $db = get_db_connect(); $user = get_login_user($db); $items = get_items($db); include_once VIEW_PATH. 'index_view.php';index_add_cart.php<?php require_once '../conf/const.php'; require_once MODEL_PATH. 'functions.php'; require_once MODEL_PATH. 'users.php'; require_once MODEL_PATH. 'items.php'; require_once MODEL_PATH. 'cart.php'; session_start(); if(is_logined() === false){ redirect_to(LOGIN_URL); } $db = get_db_connect(); $user = get_login_user($db); $item_id = get_post('item_id'); // カートに追加 if(add_cart($db, $user['user_id'], $item_id)){ set_message('カートに商品を追加しました。'); } else{ set_error('カートの更新に失敗しました。'); } redirect_to(INDEX_URL);カートの商品を購入
Model
functions.phpfunction has_error(){ return isset($_SESSION['__errors']) && count($_SESSION['__errors']) !== 0; }carts.php// カートの商品データ function get_user_carts($db, $user_id){ $sql = " SELECT sample_items.item_id, sample_items.name, sample_items.price, sample_items.stock, sample_carts.cart_id, sample_carts.user_id, sample_carts.amount FROM sample_carts JOIN sample_items ON sample_carts.item_id = sample_items.item_id WHERE sample_carts.user_id = ? "; return fetch_all_query($db, $sql, array($user_id)); } // カートの商品の合計額 function sum_carts($carts){ $total_price = 0; foreach($carts as $cart){ $total_price += $cart['price'] * $cart['amount']; } return $total_price; } // 購入処理 function purchase_carts($db, $carts){ if(validate_cart_purchase($carts) === false){ return false; } // 購入後、カートの中身削除&在庫変動 $db->beginTransaction(); try { foreach($carts as $cart){ if(update_stock($db, $cart['item_id'], $cart['stock'] - $cart['amount']) === false){ set_error($cart['name'] . 'の購入に失敗しました。'); } } delete_user_carts($db, $carts[0]['user_id']); $db->commit(); }catch(PDOException $e){ $db->rollback(); throw $e; } } function delete_user_carts($db, $user_id){ $sql = " DELETE FROM sample_carts WHERE user_id = ? "; execute_query($db, $sql, array($user_id)); } // バリデーション function validate_cart_purchase($carts){ if(count($carts) === 0){ set_error('カートに商品が入っていません。'); return false; } foreach($carts as $cart){ if($cart['stock'] - $cart['amount'] < 0){ set_error($cart['name'] . 'は在庫が足りません。購入可能数:' . $cart['stock']); } } if(has_error() === true){ return false; } return true; }Controller
cart.php<?php require_once '../conf/const.php'; require_once MODEL_PATH . 'functions.php'; require_once MODEL_PATH . 'users.php'; require_once MODEL_PATH . 'items.php'; require_once MODEL_PATH . 'carts.php'; session_start(); if(is_logined() === false){ redirect_to(LOGIN_URL); } $db = get_db_connect(); $user = get_login_user($db); $carts = get_user_carts($db, $user['user_id']); $total_price = sum_carts($carts); require_once VIEW_PATH. 'cart_view.php';finish.php<?php require_once '../conf/const.php'; require_once MODEL_PATH . 'functions.php'; require_once MODEL_PATH . 'users.php'; require_once MODEL_PATH . 'items.php'; require_once MODEL_PATH . 'carts.php'; session_start(); if(is_logined() === false){ redirect_to(LOGIN_URL); } $db = get_db_connect(); $user = get_login_user($db); $carts = get_user_carts($db, $user['user_id']); $total_price = sum_carts($carts); // 購入処理 if(purchase_carts($db, $carts) === false){ set_error('商品が購入できませんでした。'); redirect_to(CART_URL); } include_once VIEW_PATH. 'finish_view.php';カートの商品を削除
Model
carts.php// カートの商品の削除 function delete_cart($db, $cart_id){ $sql = " DELETE FROM sample_carts WHERE cart_id = ? LIMIT 1 "; return execute_query($db, $sql, array($cart_id)); }Controller
cart_delete.php<?php require_once '../conf/const.php'; require_once MODEL_PATH . 'functions.php'; require_once MODEL_PATH . 'users.php'; require_once MODEL_PATH . 'items.php'; require_once MODEL_PATH . 'carts.php'; session_start(); if(is_logined() === false){ redirect_to(LOGIN_URL); } $db = get_db_connect(); $user = get_login_user($db); $cart_id = get_post('cart_id'); if(delete_cart($db, $cart_id)){ set_message('カートの商品を削除しました。'); } else { set_error('カートの商品の削除に失敗しました。'); } redirect_to(CART_URL);
- 投稿日:2020-08-17T18:07:16+09:00
MySQL⑥ レコードの更新、文字列の扱い
レコードの更新、削除
全てのレコードのカラムを更新する update テーブル名 set 更新するカラム名 = 更新する値;
update users set score = 5.9;
特定のレコードだけ更新する update テーブル名 set 更新するカラム名 = 更新する値 where 条件にするカラム名 = 条件にする値;
update users set score = 5.9 where id = 1;
複数のカラムを更新する
update users set name = 'sasaki', score = 2.9 where name = 'tanaka';
レコードの全件削除
delete from users;
条件を指定して削除
delete from users where score < 5.0;
数値の演算
+ - * / %
カラムの値を計算して更新する
id が偶数の人のスコアを 1.2倍する。
update users set score = score * 1.2 where id % 2 = 0;数値の丸め(四捨五入)
select round(5.355); -> 5
小数点 1 桁目で丸める
select round(5.355, 1); -> 5.4
小数点以下の切り捨て
select floor(5.833); -> 5
小数点以下の切り上げ
select ceil(5.238); -> 6
ランダムで抽出する
select rand();
*rand() を使うと 0 以上 1 未満のランダムな数値を返す。rand()で抽選1名
select * from users order by rand() limit 1;
文字列の演算
文字数の表示
select length('Hello'); --> 5
何文字目以降を表示
select substr('Hello', 2); -->ello
select substr('Hello', 2, 3); -->ell大文字にする
select upper('Hello'); --> HELLO
小文字にする
select lower('HELLO'); -->hello
連結する
select concat('hello', 'world'); --> helloworld
文字数でならべかえる
elect length(name), name from users order by length(name);
カラムに別名をつける as
select length(name) as len, name from users order by len;
- 投稿日:2020-08-17T12:35:46+09:00
AWS EC2のMySQL起動できない!Buffer poolのメモリが足りない!
業務中にいつも使っているMySQLの障害が発生しまして、それを解決するため行った対応をメモしました。
問題
EC2上にMySQLのDBを作成して運用していて、最初は異常なく使ってきましたが、最近よく週一回の頻度で意図しないMySQL停止が起こされて、MySQLの再起動を行っても直らない現象がありました。
結論
InnoDBのBuffer poolのメモリが足りないことでした。
そのため、Swap領域を作ってあげて、MySQLを再起動して解決しました。エラー調査
1. statusを確認する。
systemctl status mysqld.service下記のようなメッセージが出てきましたので、MySQLサービスは動いてないことを確定しました。
● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: failed (Result: start-limit) since Mon 2020-08-17 09:07:45 JST; 2s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 3726 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=1/FAILURE) Process: 3704 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 24323 (code=killed, signal=KILL) systemd[1]: Failed to start MySQL Server. systemd[1]: Unit mysqld.service entered failed state. systemd[1]: mysqld.service failed. systemd[1]: mysqld.service holdoff time over, scheduling restart. systemd[1]: start request repeated too quickly for mysqld.service systemd[1]: Failed to start MySQL Server. systemd[1]: Unit mysqld.service entered failed state. systemd[1]: mysqld.service failed.2. mysqld.logの内容を確認する。
my.cnf
にログの保存場所を記載しています。my.cnf
の場所を忘れた場合、下記のコマンドで可能な場所を探してください。mysql --help | grep my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
my.cnf
の中に、log-error=/var/log/mysqld.logという記述がありましたので、ログの場所を確認できます。mysqld.log[Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M [ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12 [ERROR] InnoDB: Cannot allocate memory for the buffer pool [ERROR] InnoDB: Plugin initialization aborted with error Generic errorbuffer poolのメモリの問題でして、容量が足りないではないかと思い、一旦容量を増やす方向で対応します。
解決方法
// 空ファイルの作成 # dd if=/dev/zero of=/swapfile bs=1M count=1024 // 作成したファイルをswap領域に設定 # mkswap /swapfile // swap領域を有効にする # swapon /swapfile // メモリの確認 # free -m total used free shared buff/cache available Mem: 479 167 11 3 300 296 Swap 1023 0 1023 // MySQL再起動 # systemctl restart mysqld.service // MySQL status確認 # systemctl status mysqld.service他の方法
試してないですが、一応別の方法も記載しておきます。
MySQLの設定でbuffer_pool_sizeの変更は可能みたいですので、設定値を編集してみるのも良いかもしれません。
my.cnf
に下記の記述を追加or編集してから、再起動します。innodb_buffer_pool_size = 256MMySQLにアクセスできる場合、下記のコマンドで設定値の確認ができます。
> SHOW VARIABLES LIKE 'innodb_buffer_pool_size' Variable_name Value innodb_buffer_pool_size 134217728最後
MySQLを再起動したら、
innodb_buffer_pool_size
を確認しました。Variable_name Value innodb_buffer_pool_size 134217728先ほどのエラログの内容
mysqld.log[ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12両方を再度確認してみたら、やはり容量が足りないことがわかりました。
swap領域を作成してあげましたので、これで一旦解決できていると思います。作業メモは以上でした。
- 投稿日:2020-08-17T11:45:27+09:00
MySQL⑤ 抽出
データを抽出する
全てのデータを抽出する
select * from users;
カラムを指定して抽出する
select id, name from users;
条件をつける
< > <= >= = <> !=
is null, is not null
and or notfloat型の様な小数についてはうまく表すことができず多くのデータベースは小数を「それに最も近い数値」として保存するようになっています。
数値を整数に変換してから保存する。
scoreが6.0以上
select * from users where score >= 6.0;
score が3.0以上6.0以下
select * from users where score >= 3.0 and score <= 6.0;
select * from users where score between 3.0 and 6.0;name が AAA か BBB
select * from users where name = 'taguchi' or name = 'fkoji';
select * from users where name in ('taguchi', 'fkoji');文字列が一致
select * from users where name = 'taguchi';
特定の1文字から始まる like '文字%'
select * from users where name like 't%';
特定の1文字で終わる like '%文字'
select * from users where name like '%a';
特定の1文字を含む like '%文字%'
select * from users where name like '%a%';
大文字と小文字を区別する ike binary '文字%';
select * from users where name like binary 'T%';
文字数を指定する like '______';
6文字
select * from users where name like '______';何文字目に特定の文字を含む like '__文字%';
2文字目にaを含む
+select * from users where name like '_a%';並び替え、抽出件数の制限
小さい順に並び替える。 select * from テーブル名 order by カラム名;
select * from users order by score;
大きい順に並び替える。 select * from テーブル名 order by カラム名 desc;
select * from users where score is not null order by score desc;
件数を制限する limit 件数;
select * from users limit 3;
次の 数件を表示したい limit 飛ばす件数 offset 表示する件数;
select * from users limit 3 offset 3;
組み合わせると
select * from users order by score desc limit 3;
- 投稿日:2020-08-17T01:56:39+09:00
MySQL④
後から一意制約を付ける alter table テーブル名 add unique unique_name(カラム);
例えば、usersテーブルのnameフィールドをuniqueにしたい、という場合には以下のようにしてあげるといいでしょう(unique_nameはインデックスの名前なので適当につけてあげればOKです)。
mysql> alter table users add unique unique_name(name);
後から一位制約を外す alter table テーブル名 drop index unique_name;
またこのunique制約を外したい場合は、うえで付けたインデックスの名前を使って次のようにしてあげればOKです。
alter table users drop index unique_name;
テーブルの構造を変える
カラムを追加する alter table テーブル名 add column カラム名 データ型;
alter table users add column email varchar(255);
追加する場所を指定する
nameカラム のあとに追加したかった場合には
alter table users add column email varchar(255) after name;
カラムを削除する alter table テーブル名 drop column カラム名;
alter table users drop column score;
カラムを変更する alter table テーブル名 change 元カラム名 新カラム名 データ型 オプション;
alter table users change name user_name varchar(80) default 'nobody';
テーブルの構造を確認する
desc users
テーブル名を変える alter table 元テーブル名 rename 新テーブル名;
alter table users rename persons;