Mysql

如果不存在則創建表

  • August 10, 2017

我仍然是使用數據庫的新手,但目前我正在使用 mysql 數據庫並試圖使我的 bash 腳本牢不可破,因為它可能用於幾種不同的環境(dev、qa 等)。我知道它會在沒有這一行的情況下正常執行。

CREATE TABLE IF NOT EXISTS backupfiles (fileName VARCHAR(20), archiveId VARCHAR(500), checkSum VARCHAR(100), glacierVault VARCHAR(100), timeStamp date);

我也知道,如果我在該表不存在時將該確切行放入我的數據庫中,那麼它會完美執行,如果它已經存在,它會給我一個警告,但不會中斷。

+-------+------+------------------------------------+
| Level | Code | Message                            |
+-------+------+------------------------------------+
| Note  | 1050 | Table 'backupfiles' already exists |
+-------+------+------------------------------------+

當我執行上面的行並且沒有名為 backupfiles 的表時,它工作得很好,但是當它掛起時(當我說掛起時,它就坐在那裡,什麼也不做)95% 的時間和 5% 的時間工作。有沒有人遇到過這樣的問題?我正在使用 AWS RDS(亞馬遜網路服務關係數據庫服務),mysql 伺服器是 5.5.27

這是我與mysql數據庫相關的所有程式碼

mysql -h portal-rds -u $user --password=$mysqlpw <<QUERY_INPUT
CREATE DATABASE IF NOT EXISTS $DATABASE;
use $DATABASE;
CREATE TABLE IF NOT EXISTS backupfiles (fileName VARCHAR(20), archiveId VARCHAR(500), checkSum VARCHAR(100), glacierVault VARCHAR(100), timeStamp date);
INSERT INTO backupfiles VALUES ('$archive_file_name', '$archiveID', '$CURRENTVAULT', '$checkSum', CURDATE());
COMMIT;
QUERY_INPUT

我覺得這令人不安有兩個原因

原因 #1

這可能是一個從未從 MySQL 5.5.17 中消除的錯誤

原因 #2

您正在嘗試在 RDS 環境中獲取 InnoDB 表上的元數據鎖?哎喲!!!

可能的解決方法

不要信任 RDS 中的元數據鎖定,而是詢問 information_schema 表是否已經存在。假設表是mydb.backupfiles。執行此查詢:

SELECT COUNT(1) FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='backupfiles';

如果答案返回 0,請執行CREATE TABLE backupfiles ...。否則,不要執行它。

可能的解決方案

升級到最新的 MySQL (5.6.12) 或最新的 MySQL5.5 (5.5.31)。希望這個問題在更新的版本中得到解決

試一試 !!!

更新 2013-07-11 15:16 EDT

這是您的 bash 程式碼的重寫,以檢查表是否已存在

   echo "CREATE DATABASE IF NOT EXISTS $DATABASE;" > /tmp/runthis.sql
   echo "use $DATABASE;" >> /tmp/runthis.sql
   SQLSTMT="SELECT COUNT(1) FROM information_schema.tables"
   SQLSTMT="${SQLSTMT} WHERE table_schema='${DATABASE}' AND table_name='backupfiles';"
   TABLE_EXISTS=`mysql -h portal-rds -u $user --password=$mysqlpw -ANe"${SQLSTMT}"`
   if [[ ${TABLE_EXISTS} -eq 0 ]]; then
     SQLSTMT="CREATE TABLE backupfiles (fileName VARCHAR(20),"
     SQLSTMT="${SQLSTMT} archiveId VARCHAR(500), checkSum VARCHAR(100),"
     SQLSTMT="${SQLSTMT} glacierVault VARCHAR(100), timeStamp date);"
     echo "${SQLSTMT}" >> /tmp/runthis.sql
   fi
   SQLSTMT="INSERT INTO backupfiles VALUES ('$archive_file_name',"
   SQLSTMT="${SQLSTMT} '$archiveID', '$CURRENTVAULT', '$checkSum', CURDATE());"
   echo "${SQLSTMT}" >> /tmp/runthis.sql
   echo "COMMIT;" >> /tmp/runthis.sql
   mysql -h portal-rds -u $user --password=$mysqlpw < /tmp/runthis.sql

引用自:https://dba.stackexchange.com/questions/46164