The ALTER TABLE statement is one of the most frequently used statements in the MySQL world – the statement allows you to add, delete or modify columns in a table. In this blog post we will try to look deeper into what it is, what it does and when should it be used.
What is ALTER TABLE and What Does it Do?
As already mentioned above, the ALTER TABLE statement enables DBAs and developers to add, delete or modify columns in a table. Simply put ALTER TABLE changes the structure of a table – it enables you to add, delete columns, add or remove indexes, rename columns or change their type.
When and How Do I Use ALTER TABLE?
In order to use ALTER TABLE you generally need the ALTER, CREATE and INSERT privileges. For renaming a table, required privileges are ALTER and DROP for the old table, then CREATE, ALTER and INSERT privileges for the new table to be created. To assign the required privileges to a certain user, you can use the following query:
Replace database with your database name, the wildcard with the table name if you wish the privileges to only be applicable to certain tables (the wildcard makes the privilege applicable across all tables) and demo_user with the name of your user. If you want the privileges to be used across all databases and all tables within them, simply replace database with a wildcard:
In order to actually make use of the ALTER TABLE statement, run a query that changes the structure of a table – ALTER TABLE is used to add, delete or modify columns in a table: the query can also be used to add indexes to columns. Here’s a few basic examples of most frequently used queries:
his query would add a column column_name to a table demo_table. Add FIRST to the end of the query to make the column the first column in the table.
his query would add a column column_2 after the column column_1 on a table demo_table.
This query would add a generated column to the table.
This query would drop the column demo_column on a table demo_table.
This query would add an index named demo_index (names can be chosen) on a column called demo_column in a table called demo_table.
This query would add an index on a column demo_column and an unique index on the demo_unique column.
This query would change the default character set of a specific column.
This query would change the default character set of the table and all character (CHAR, VARCHAR and TEXT) columns.
This query would partition the column demo_column into 8 partitions by hash.
This query would convert the table demo_table to disk-based storage.
If you are adding indexes, keep in mind that you can add different types of indexes (for example, a BTREE index or a FULLTEXT index), you can also add an index that covers only a certain amount of characters in a column with a query like so:
The above query would add an index called demo_index on the first 10 characters of the column called column_name in a table called demo_table.
Indexes in MySQL are a complex beast and they really deserve a topic of their own so we will not go into details here, but if you want to learn more, our earlier post about MySQL indexes should provide some more insight.
How Does ALTER TABLE Work?
ALTER TABLE in MySQL has its own subtleties. As of the most current version of MySQL, i.e. MySQL 8.0. There are 3 algorithms for which affects how the ALTER TABLE performs for such alterations. These are:
MySQL’s ALTER TABLE process might not be an issue with smaller tables, but if your data set is bigger you can run into issues – many people have experienced ALTER TABLE queries that have taken hours, days or even weeks to complete. In most cases, that happens because of MySQL’s table alteration process outlined above. However, there is a way to at least slightly reduce the time the query takes to complete:
Although the steps above work fine. Yet, in real-world case scenarios, DBA’s or developers take the lean to use Percona’s pt-online-schema-change or using Github’s gh-ost. You can take a look at our previous post Top Open Source Tools for MySQL & MariaDB Migrations which takes an overview of these schema-change tools.
Anyway, what we have described above is frequently known as the “shadow copy” approach: in essence, you build a new table with the desired structure, then perform a rename and drop to swap the two tables. There also is another way: you can also swap servers around and run ALTER TABLE on servers that are not in production. For MyISAM, you can DISABLE KEYS, load data, then ENABLE KEYS.
ALTER TABLE Gotchas
If you are using the ALTER TABLE statement to create indexes (you can also use the CREATE INDEX statement), it is advised to create indexes after inserting the data because that’s a pretty well known way of speeding up processing not only in MySQL, but also in other database management systems, such as Oracle. In general though, keep in mind that most ALTER TABLE operations should be expected to cause some issues (interruption of service) to MySQL.
There also is another way to speed up the entire process though, albeit it’s a little bit more advanced: if you can convince MySQL to only modify the table’s .frm file (.frm files describe the definition of the table) and leave the table alone, the process will be faster:
Also keep in mind that if you want to modify a column and the syntax seems correct but you still get an error, it might be time to look into a different syntax. For example:
A query like this would error out because long is a reserved word. In order to avoid such an error, escape the word with backticks:
It is also worth noting that the column names can only be escaped using backticks and not with single quotes or double quotes. For example, a query like so would error out too:
MySQL uses the ALTER TABLE statement to add, delete or modify columns in a table. In order for the statement to be successfully executed, you must have the ALTER,CREATE and INSERT privileges for the table. The statement also has a few subtleties unique to itself: its performance can suffer when running on very large tables due to the way it works, but as long as you know how the statement works and what it does you should be just fine.
Subscribe to get our best and freshest content