如果我將 MYSQL 5.7 中允許的最大位數從 double(8,2) 修改為 double(12,2),是立即更改還是需要處理所有行?
uj5u.com熱心網友回復:
您可以對此進行測驗以查看是否可以將其更改為即時更改:
mysql> create table mytable (id serial primary key, d double(8,2));
mysql> alter table mytable modify column d double(25,2), algorithm=inplace, lock=none;
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 1
這些選項algorithm=inplace, lock=none意味著您希望更改作為即時更改運行,而不執行表復制。默認情況下,如果更改可以在該模式下完成,MySQL 會在該模式下運行 DDL 更改。
如果您明確請求它,但無法在該模式下進行更改,那么您將收到錯誤訊息。
例如:
mysql> alter table mytable modify column d float(8,2), algorithm=inplace, lock=none;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported.
Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
在此示例中,我將 8-byteDOUBLE更改為 4-byte FLOAT。如果不復制表,就無法對資料型別的大小進行任何更改。因此,將其作為即時更改執行的請求失敗并回傳顯示的錯誤。
因此,如果您對給定的更改是否可以立即完成有疑問,您可以使用此方法對其進行測驗。您不必針對您的生產表進行測驗!我在我的本地實體上做了這個測驗,甚至沒有向表中添加任何資料。如上所示,我剛剛創建了一個空表,然后運行了 DDL。
您應該閱讀https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html以了解可以就地完成哪些型別的 DDL 更改的詳細資訊。
uj5u.com熱心網友回復:
正如MySQL 參考手冊中所寫,所有 ALTER Table 陳述句都需要處理時間。在此之上 MySQL 將轉換資料:
對于使用 CHANGE 或 MODIFY 的資料型別更改,MySQL 嘗試盡可能地將現有列值轉換為新型別。
因此將訪問所有列。
uj5u.com熱心網友回復:
除了不推薦為浮點資料型別指定位數之外,從 double(8,2) 更改為 double(12,2) 不會更改列型別,它仍然是雙精度 8 位元組數,所以即使是一行也不會改變它的值。
例子:
CREATE TABLE t1 (a double(6,2));
INSERT INTO t1 VALUES (1234.56);
# change the precision
ALTER TABLE t1 change a a double(4,2);
INSERT INTO t1 VALUES (1234.56);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
SELECT a FROM t1;
---------
| a |
---------
| 1234.56 |
---------
即使 1234.56 不適合 double(4,2) 它仍然保持不變。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517921.html
標籤:mysqlsqlddl
下一篇:過濾SQLWHERE子句
