SQL SHELL.SCIPT語法 讓所有table新增欄位和更新欄位 - lustan3216/BlogArticle GitHub Wiki
SELECT table_name FROM information_schema.tables where table_schema=‘food’;
以上這行意思是從database = food抓全部的table名稱
ALTER TABLE clients ADD (created_at datetime, updated_at datetime);
以上這行clients加入兩個欄位和形態
UPDATE clients SET created_at = FROM_UNIXTIME(created),updated_at = FROM_UNIXTIME(modified);
更新這個欄位
mysql -uroot -p -e "SELECT table_name FROM information_schema.tables where table_schema='test123'" > /tmp/t
/tmp是暫存區 (但應該是指記憶體的暫存 連資料夾都不存在) xxxxxx xxxx xxx > /tmp/t 可以把所有的table名稱塞進 暫存區裡面 但是因為是mysql語法所以會多存一行header 要把第一行刪掉
sed -i .bak '1d' /tmp/t
然後再用more
more /tmp/t 就可以叫出剛剛暫存的table名稱
##下面這行是代表把所有table_name用 d 變數表示
for d in `cat /tmp/t`
do
echo "ALTER TABLE $d ADD (created_at datetime, updated_at datetime);"
echo "UPDATE $d SET create_at = FROM_UNIXTIME(created), updated_at = FROM_UNIXTIME(modified);"
done
## $d用的時候要加錢號
##最後再進化一下要變成以下這樣把指令都存起來
>> /tmp/y 就是把指令存進 y檔裡面
rm -rf /tmp/y && for d in `cat /tmp/t`
do
echo "ALTER TABLE $d ADD (created_at datetime, updated_at datetime);" >> /tmp/y
echo "UPDATE $d SET $d.create_at = FROM_UNIXTIME($d.created), $d.updated_at = FROM_UNIXTIME($d.modified);" >> /tmp/y
done
把存在/tmp/y 裡面的sql command全部導入test123
mysql -uroot -p test123 < /tmp/y
終極版本 因為要符合只有created_at沒有和created有的時候才執行所以多了條件式
rm -rf /tmp/y && for d in `cat /tmp/t`
do
rm -rf /tmp/c && rm -rf /tmp/d && rm -rf /tmp/e && rm -rf /tmp/f
$(mysql -u root datbase_name -se "SHOW COLUMNS FROM $d where field = 'created_at'" > /tmp/c)
$(mysql -u root datbase_name -se "SHOW COLUMNS FROM $d where field = 'created'" > /tmp/d )
$(mysql -u root datbase_name -se "SHOW COLUMNS FROM $d where field = 'updated_at'" > /tmp/e)
$(mysql -u root datbase_name -se "SHOW COLUMNS FROM $d where field = 'modified'" > /tmp/f)
count_c=`cat /tmp/c | wc -l`
count_d=`cat /tmp/d | wc -l`
count_e=`cat /tmp/e | wc -l`
count_f=`cat /tmp/f | wc -l`
if [ "$count_c" -eq "0" ] && [ "$count_d" -eq "0" ] ; then
echo "ALTER TABLE $d ADD created_at datetime NOT NULL;" >> /tmp/y
fi
if [ "$count_e" -eq "0" ] && [ "$count_f" -eq "0" ]; then
echo "ALTER TABLE $d ADD updated_at datetime NOT NULL;" >> /tmp/y
fi
if [ "$count_c" -eq "0" ] && [ "$count_d" -eq "1" ]; then
echo "ALTER TABLE $d ADD created_at datetime NOT NULL DEFAULT '1970-01-01 00:00:01';" >> /tmp/y
echo "UPDATE $d SET $d.created_at = FROM_UNIXTIME($d.created);" >> /tmp/y
fi
if [ "$count_e" -eq "0" ] && [ "$count_f" -eq "1" ]; then
echo "ALTER TABLE $d ADD updated_at datetime NOT NULL DEFAULT '1970-01-01 00:00:01';" >> /tmp/y
echo "UPDATE $d SET $d.updated_at = FROM_UNIXTIME($d.modified);" >> /tmp/y
fi
done
如果要用assign 的話,變數跟等號之間不能有空白 /tmp/c or /tmp/d .... 這些是一般檔案,非執行檔,所以要用 cat /tmp/c 才能去count 行數 $() 是執行語法 -a == && -o == ||
| or > 這些東西,再配合一些 awk, sort, uniq .....find, xargs…for …這些就可以搞出不少東西 以上這幾個用法有時間要研究一下