mysql使用虚拟列需要考虑的一个问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aoerqileng/article/details/81012422

mysql5.7版本的虚拟列功能在很多场景下都能使用,但是需要注意一点,在后续维护的时候,如果包含虚拟列的表在添加字段,做表结构修改的时候,pt工具无法使用,需要直接执行命令。测试如下:

mysql> CREATE TABLE contacts (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     first_name VARCHAR(50) NOT NULL,
    ->     last_name VARCHAR(50) NOT NULL,
    ->     fullname varchar(101) GENERATED ALWAYS AS (CONCAT(first_name,' ',last_name)),
    ->     email VARCHAR(100) NOT NULL
    -> );
Query OK, 0 rows affected (0.09 sec)

mysql> insert into contacts(id,first_name,last_name,email) values(1,'aa','bb','[email protected]');
Query OK, 1 row affected (0.02 sec)

mysql> select * from contacts;
+----+------------+-----------+----------+------------+
| id | first_name | last_name | fullname | email      |
+----+------------+-----------+----------+------------+
|  1 | aa         | bb        | aa bb    | [email protected] |
+----+------------+-----------+----------+------------+
1 row in set (0.01 sec)

mysql> create table contacts_c like contacts;
Query OK, 0 rows affected (0.04 sec)

mysql> show create table contacts_c;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                                                                                                                                            |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| contacts_c | CREATE TABLE `contacts_c` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(50) NOT NULL,
  `last_name` varchar(50) NOT NULL,
  `fullname` varchar(101) GENERATED ALWAYS AS (concat(`first_name`,' ',`last_name`)) VIRTUAL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> insert into contacts_c(id,first_name,last_name,fullname,email) select id,first_name,last_name,fullname,email;
ERROR 1054 (42S22): Unknown column 'id' in 'field list'
mysql> insert into contacts_c(id,first_name,last_name,fullname,email) select id,first_name,last_name,fullname,email from contacts;
ERROR 3105 (HY000): The value specified for generated column 'fullname' in table 'contacts_c' is not allowed.

可见在使用这个功能的时候需要考虑到这一点,否则线上变更影响比较大。

猜你喜欢

转载自blog.csdn.net/aoerqileng/article/details/81012422
今日推荐