MySQL重命名表

MySQL重命名表

在本教程中,您将学习如何使用MySQL RENAME TABLE语句和ALTER TABLE语句重命名表。

MySQL RENAME TABLE语句简介

由于业务需求变化,我们需要将当前表重新命名为新表,以更好地反映或表示新情况。 MySQL提供了一个非常有用的语句来更改一个或多个表的名称。

要更改一个或多个表,我们使用RENAME TABLE语句如下:

RENAME TABLE old_table_name TO new_table_name;

旧表(old_table_name)必须存在,新表(new_table_name)必须不存在。 如果新表new_table_name存在,则该语句将失败。

除了表之外,我们还可以使用RENAME TABLE语句来重命名视图

在执行RENAME TABLE语句之前,必须确保没有活动事务或锁定表

请注意,不能使用RENAME TABLE语句来重命名临时表,但可以使用ALTER TABLE语句重命名临时表。

在安全性方面,我们授予旧表的任何权限必须手动迁移到新表。

在重命名表之前,应该彻底地评估影响。 例如,应该调查哪些应用程序正在使用该表。 如果表的名称更改,那么引用表名的应用程序代码也需要更改。 此外,您必须手动调整引用该表的其他数据库对象,如视图存储过程触发器外键约束等。 我们将在下面的例子中更详细地讨论。

MySQL RENAME TABLE示例

首先,我们创建一个名为hrdb的新数据库,它由两个表组成:employeesdepartments

创建数据库 –

CREATE DATABASE IF NOT EXISTS hrdb;

创建表 –

USE hrdb;

CREATE TABLE departments (
    department_id INT AUTO_INCREMENT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    id int AUTO_INCREMENT primary key,
    first_name varchar(50) not null,
    last_name varchar(50) not null,
    department_id int not null,
    FOREIGN KEY (department_id)
        REFERENCES departments (department_id)
);

其次,将样本数据插入到 employeesdepartments 表中:

-- 插入数据到 departments 表中
INSERT INTO departments(dept_name)
VALUES('Sales'),('Markting'),('Finance'),('Accounting'),('Warehouses'),('Production');

-- 插入数据到 employees 表中
INSERT INTO employees(first_name,last_name,department_id) 
VALUES('John','Doe',1),
 ('Bush','Lily',2),
 ('David','Dave',3),
 ('Mary','Jane',4),
 ('Jonatha','Josh',5),
 ('Mateo','More',1);

第三,查询在 employeesdepartments 表中的数据:

mysql> SELECT 
    department_id, dept_name
FROM
    departments;
+---------------+------------+
| department_id | dept_name  |
+---------------+------------+
|             1 | Sales      |
|             2 | Markting   |
|             3 | Finance    |
|             4 | Accounting |
|             5 | Warehouses |
|             6 | Production |
+---------------+------------+
6 rows in set

mysql> SELECT 
    id, first_name, last_name, department_id
FROM
    employees;
+----+------------+-----------+---------------+
| id | first_name | last_name | department_id |
+----+------------+-----------+---------------+
|  1 | John       | Doe       |             1 |
|  2 | Bush       | Lily      |             2 |
|  3 | David      | Dave      |             3 |
|  4 | Mary       | Jane      |             4 |
|  5 | Jonatha    | Josh      |             5 |
|  6 | Mateo      | More      |             1 |
+----+------------+-----------+---------------+
6 rows in set

重命名视图引用的表

如果重命名一个被视图引用的表,在重命名表后,视图就无效了,并且必须手动调整视图。

例如,我们基于employeesdepartments表创建一个名为v_employee_info的视图,如下所示:

CREATE VIEW v_employee_info as
    SELECT 
        id, first_name, last_name, dept_name
    from
        employees
            inner join
        departments USING (department_id);

视图使用内连接子句来连接employeesdepartments表。

以下SELECT语句返回v_employee_info视图中的所有数据。

mysql> SELECT 
    *
FROM
    v_employee_info;
+----+------------+-----------+------------+
| id | first_name | last_name | dept_name  |
+----+------------+-----------+------------+
|  1 | John       | Doe       | Sales      |
|  2 | Bush       | Lily      | Markting   |
|  3 | David      | Dave      | Finance    |
|  4 | Mary       | Jane      | Accounting |
|  5 | Jonatha    | Josh      | Warehouses |
|  6 | Mateo      | More      | Sales      |
+----+------------+-----------+------------+
6 rows in set

现在,将v_employee_info视图中的employees表重命名为people,并查询视图的数据。

RENAME TABLE employees TO people;

-- 查询数据
SELECT 
    *
FROM
    v_employee_info;

MySQL返回以下错误消息:

1356 - View 'hrdb.v_employee_info' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

我们可以使用CHECK TABLE语句来检查v_employee_info视图的状态如下:

CHECK TABLE v_employee_info;
mysql> CHECK TABLE v_employee_info;
+----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+
| Table                | Op    | Msg_type | Msg_text                                                                                                                               |
+----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+
| hrdb.v_employee_info | check | Error    | Table 'hrdb.employees' doesn't exist                                                                                                   |
| hrdb.v_employee_info | check | Error    | View 'hrdb.v_employee_info' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them |
| hrdb.v_employee_info | check | error    | Corrupt                                                                                                                                |
+----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set

需要手动更改v_employee_info视图,以便它引用people表而不是employees表。

重命名由存储过程引用的表

如果要重命名由存储过程引用的表,则必须像对视图一样进行手动调整。

首先,将people表重命名为employees表。

RENAME TABLE people TO employees;

然后,创建一个名为get_employee的新存储过程,该过程引用employees表。

DELIMITER $$

CREATE PROCEDURE get_employee(IN p_id INT)

BEGIN
 SELECT first_name
 ,last_name
 ,dept_name
 FROM employees
 INNER JOIN departments using (department_id)
 WHERE id = p_id;
END $$

DELIMITER;

接下来,执行get_employee存储过程从employees表来获取id1的员工的数据,如下所示:

CALL get_employee(1);

执行上面查询语句,得到以下结果 –

mysql> CALL get_employee(1);
+------------+-----------+-----------+
| first_name | last_name | dept_name |
+------------+-----------+-----------+
| John       | Doe       | Sales     |
+------------+-----------+-----------+
1 row in set

Query OK, 0 rows affected

之后,我们再次将employees表重新命名为people表。

RENAME TABLE employees TO people;

最后,调用get_employee存储过程来获取id2的员工信息:

CALL get_employee(2);

MySQL返回以下错误消息:

1146 - Table 'hrdb.employees' doesn't exist

要解决这个问题,我们必须手动将存储过程中的employees表更改为people表。

重命名引用外键的表

departments表使用department_id列链接到employees表。 employees表中的department_id列是引用departments表的department_id列作为外键

如果重命名departments表,那么指向departments表的所有外键都不会被自动更新。 在这种情况下,我们必须手动删除并重新创建外键。

RENAME TABLE departments TO depts;

我们删除ID1的部门,由于外键约束,people表中的所有行也应删除。 但是,我们将department表重命名为depts表,而不会手动更新外键,MySQL会返回错误,如下所示:

DELETE FROM depts 
WHERE
    department_id = 1;

执行上面语句,得到以下以下错误提示 –

1451 - Cannot delete or update a parent row: a foreign key constraint fails (`hrdb`.`people`, CONSTRAINT `people_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `depts` (`department_id`))

重命名多个表

也可以使用RENAME TABLE语句来一次重命名多个表。 见下列声明:

RENAME TABLE old_table_name_1 TO new_table_name_2,
             old_table_name_2 TO new_table_name_2,...

以下语句将 peopledepts 重命名为 employeesdepartments 表:

RENAME TABLE depts TO departments,
             people TO employees;

注意RENAME TABLE语句不是原子的。所以如果在任何时候发生错误,MySQL会将所有重新命名的表都回滚到旧名称。

使用ALTER TABLE语句重命名表

我们可以使用ALTER TABLE语句重命名一个表,如下所示:

ALTER TABLE old_table_name
RENAME TO new_table_name;

RENAME TABLE语句不能用于重命名临时表,这时就可以使用ALTER TABLE语句来重命名一个临时表。

重命名临时表示例

首先,我们创建一个临时表,其中包含来自employees表的last_name列的所有唯一的姓氏:

CREATE TEMPORARY TABLE lastnames
SELECT DISTINCT last_name from employees;

第二步,使用RENAME TABLE重命名姓氏表:

RENAME TABLE lastnames TO unique_lastnames;

MySQL返回以下错误消息:

Error Code: 1017. Can't find file: '.\hrdb\lastnames.frm' (errno: 2 - No such file or directory)

第三,使用ALTER TABLE语句来重命名姓氏表。

ALTER TABLE lastnames
RENAME TO unique_lastnames;

第四,从unique_lastnames临时表查询数据:

SELECT 
    last_name
FROM
    unique_lastnames;

+-----------+
| last_name |
+-----------+
| Doe       |
| Lily      |
| Dave      |
| Jane      |
| Josh      |
| More      |
+-----------+
6 rows in set

在本教程中,我们向您展示了如何使用MySQL RENAME TABLEALTER TABLE语句重命名表。

 

移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:”教程” 选择相关教程阅读

103 Responses

  1. Akqhvl说道:

    order lexapro 20mg without prescription escitalopram 10mg us revia 50mg cheap

  2. Yjnbeh说道:

    lasix 40mg oral buy ventolin 4mg for sale order ventolin inhalator online cheap

  3. Zydcmi说道:

    order strattera 10mg without prescription quetiapine 50mg pill oral zoloft 100mg

  4. Vmlgxv说道:

    ursodiol 150mg price zyrtec 10mg drug cost zyrtec 10mg

  5. Cnmkof说道:

    generic zithromax 500mg buy gabapentin 600mg sale buy neurontin 100mg

  6. Dzkcyt说道:

    best medicine for acid reflux natural supplements for indigestion drugs that cause flatulence

  7. Mohbgn说道:

    purchase prednisone generic how to buy prednisone brand amoxicillin 1000mg

  8. Myhmeb说道:

    online birth control prescription canada birth control instant death canada buy premature ejaculation pills

  9. Cnmswm说道:

    promethazine 25mg price buy stromectol no prescription buy stromectol 3mg

  10. Szioxa说道:

    best over the counter ulcer medication how are antiarrhythmic drugs classified gram negative treatment antibiotic list

  11. Njqbzi说道:

    generic duloxetine 40mg generic glipizide buy generic provigil

  12. Yeksdm说道:

    fungal infection tablets antifungal tablets terbinafine hypertension medication comparison chart

  13. Gefybo说道:

    cyproheptadine 4mg pills cost luvox 100mg oral ketoconazole 200 mg

  14. Lvufte说道:

    best supplements for herpes outbreak genital herpes over the counter diabetic pills for humans

  15. BVZ_Moskva_m说道:

    Быстро возводимые здания: бизнес-польза в каждом кирпиче!
    В современном обществе, где моменты – финансы, экспресс-конструкции стали решением, спасающим для предпринимательства. Эти современные объекты обладают твердость, экономичное использование ресурсов и быстроту установки, что придает им способность отличным выбором для разных коммерческих начинаний.
    Быстровозводимые здания
    1. Высокая скорость возвода: Секунды – самое ценное в экономике, и скоростроительные конструкции обеспечивают существенное уменьшение сроков стройки. Это высоко оценивается в вариантах, когда актуально быстро начать вести дело и начать зарабатывать.
    2. Финансовая экономия: За счет оптимизации процессов производства элементов и сборки на месте, стоимость быстровозводимых зданий часто оказывается ниже, по сравнению с традиционными строительными проектами. Это позволяет получить большую финансовую выгоду и достичь большей доходности инвестиций.
    Подробнее на scholding.ru
    В заключение, экспресс-конструкции – это идеальное решение для коммерческих задач. Они включают в себя молниеносную установку, бюджетность и надежные характеристики, что позволяет им превосходным выбором для компаний, готовых начать прибыльное дело и получать деньги. Не упустите возможность сэкономить время и средства, выбрав быстровозводимые здания для ваших будущих инициатив!

  16. Tjzuvb说道:

    buy provera 5mg buy microzide 25mg without prescription purchase microzide without prescription

  17. Clldan说道:

    most effective smoking cessation drugs uk list of standaredc painkillers how to buy painkillers online

  18. BVZ_Moskva_m说道:

    Скорозагружаемые здания: финансовая польза в каждой детали!
    В современной реальности, где время имеет значение, объекты быстрого возвода стали решением по сути для компаний. Эти современные объекты комбинируют в себе твердость, финансовую выгоду и быстрое строительство, что дает им возможность превосходным выбором для различных бизнес-проектов.
    Быстровозводимые здания работы
    1. Высокая скорость возвода: Минуты – основной фактор в экономике, и сооружения моментального монтажа обеспечивают значительное снижение времени строительства. Это особенно выгодно в постановках, когда срочно нужно начать бизнес и начать зарабатывать.
    2. Экономия средств: За счет совершенствования производственных операций по изготовлению элементов и монтажу на площадке, бюджет на сооружения быстрого монтажа часто снижается, по сравнению с традиционными строительными проектами. Это позволяет сократить затраты и получить лучшую инвестиционную отдачу.
    Подробнее на https://www.scholding.ru/
    В заключение, скоро возводимые строения – это идеальное решение для бизнес-проектов. Они объединяют в себе ускоренную установку, финансовую эффективность и надежность, что дает им возможность первоклассным вариантом для деловых лиц, готовых к мгновенному началу бизнеса и гарантировать прибыль. Не упустите шанс на сокращение времени и издержек, превосходные экспресс-конструкции для вашего предстоящего предприятия!

  19. Isjyen说道:

    oral femara 2.5 mg generic albenza buy generic aripiprazole for sale

  20. Gscyzm说道:

    strong sleep pills can steroids cause hair thinning illegal diet pills from mexico

  21. Okntsk说道:

    order uroxatral 10mg sale best over the counter medication for gerd best med for stomach gas

  22. Mayeah说道:

    minocin 100mg generic buy hytrin purchase ropinirole

  23. Ejlhsq说道:

    acne pills that actually work dermatologist recommended acne medication buy trileptal medication

  24. Apehwe说道:

    buy clonidine 0.1 mg online tiotropium bromide 9 mcg generic buy generic spiriva

  25. Awzlze说道:

    buy calcitriol generic buy generic trandate 100 mg buy fenofibrate 200mg generic

  26. Dygnmv说道:

    cost amoxicillin biaxin 500mg uk purchase macrobid pills

  27. Yrvcss说道:

    affordable dissertation writing gambling online win real money roulette free

  28. Mqylsz说道:

    buy essay online uk research dissertations buy cefixime pills

  29. Rbwjba说道:

    aspirin generic play slots online best online blackjack real money

  30. Qxgmmn说道:

    purchase lamisil for sale best winning slots online play poker online real money

  31. Kurqnq说道:

    order desyrel 50mg suhagra for sale online clindamycin usa

  32. Smdfkd说道:

    order axetil online buy axetil generic robaxin cheap

  33. Kinqrw说道:

    buy tadalafil 10mg online indocin medication order indomethacin generic

  34. Hbrcoi说道:

    buy generic tamoxifen for sale brand tamoxifen 20mg buy rhinocort without a prescription

  35. Uzxakw说道:

    retin online tretinoin uk buy avanafil 100mg online cheap

  36. Kvhybm说道:

    buy cleocin 150mg without prescription order erythromycin generic pills erectile dysfunction

  37. Zetelc说道:

    lamotrigine 50mg pills brand mebendazole brand vermox 100mg

  38. Qnabpy说道:

    order flagyl generic metronidazole 400mg cost brand cephalexin

  39. Cvykwy说道:

    buy aurogra 100mg aurogra for sale order estradiol generic

  40. Fkasez说道:

    fluconazole 200mg tablet order fluconazole 200mg generic how to buy cipro

  41. Etaknv说道:

    college essay writing help dissertation writers online write my term paper

  42. Zynntg说道:

    purchase aldactone pills valacyclovir 500mg us purchase propecia pill

  43. Usquwh说道:

    tamsulosin online order zofran 4mg over the counter simvastatin order online

  44. Sasinl说道:

    order buspirone 5mg pill buy zetia 10mg for sale brand cordarone 100mg

  45. Fkecfp说道:

    zantac 150mg pill order generic ranitidine buy celebrex 100mg generic

  46. Njllst说道:

    buy sumatriptan avodart brand dutasteride order online

  47. Znnbqt说道:

    buy allopurinol 100mg generic order allopurinol 100mg pills buy rosuvastatin 20mg pill

  48. Dclnnn说道:

    buy esomeprazole 40mg generic cost topiramate 100mg topiramate 100mg canada

  49. Pxktgq说道:

    order azelastine 10ml generic acyclovir sale avalide price

  50. Clspgc说道:

    generic pepcid pepcid order order tacrolimus 5mg pills

  51. Eetgjq说道:

    cost xenical order xenical for sale buy diltiazem 180mg sale

  52. Xgnadd说道:

    coumadin pills order paroxetine 10mg generic reglan pills

  53. Gadeuf说道:

    buy nortriptyline 25mg generic buy nortriptyline 25mg online cheap acetaminophen 500 mg brand

  54. Uyrila说道:

    order amaryl 4mg generic oral cytotec arcoxia us

  55. Dcbjgi说道:

    inderal 20mg oral nurofen cost buy plavix 150mg sale

  56. Tiolua说道:

    buy alendronate paypal fosamax price buy generic macrodantin 100mg

  57. Dxtcrp说道:

    buy ozobax paypal buy endep 50mg generic toradol oral

  58. Vrslrv说道:

    claritin for sale online order altace 5mg for sale order priligy 90mg

  59. Dbpcqy说道:

    order ozobax online cheap buy toradol 10mg pills toradol 10mg tablet

  60. Obvqpd说道:

    cost dilantin 100 mg how to get flexeril without a prescription oxybutynin 2.5mg drug

  61. Lgdyxq说道:

    aceon generic buy coversyl pills for sale order fexofenadine online cheap

  62. Lbstsk说道:

    order levitra generic buy vardenafil 20mg online tizanidine 2mg tablet

  63. Bfwood说道:

    medrol online nifedipine 10mg pill aristocort 4mg sale

  64. Zyvuvj说道:

    serophene pill order azathioprine without prescription imuran 50mg for sale

  65. Gtupqe说道:

    poker online for fun free poker online synthroid 150mcg sale

  66. Nlhwon说道:

    buy amantadine tablets atenolol sale order dapsone 100 mg

  67. Ymwflq说道:

    online gambling games oral stromectol 12mg ivermectin 12mg tablets

  68. Crsics说道:

    slots meaning where can i buy ventolin buy ventolin inhalator online

  69. Tzlctj说道:

    pantoprazole 40mg us pantoprazole 20mg cheap buy pyridium 200mg online

  70. Wcwifn说道:

    roulette online real money slots free online furosemide online

  71. Spiona说道:

    atorvastatin 40mg uk order atorvastatin 80mg generic cheap amlodipine

  72. Ifwyko说道:

    azithromycin generic neurontin brand cost gabapentin 800mg

  73. Kxcafa说道:

    accutane 10mg sale azithromycin over the counter zithromax 500mg price

  74. Ljgfcq说道:

    order cefdinir 300mg sale buy prevacid online order prevacid generic

  75. Rnakil说道:

    buy modafinil 200mg online cheap purchase phenergan pills prednisone 40mg over the counter

  76. Qdqjxv说道:

    buy generic cenforce over the counter naproxen order online buy aralen generic

  77. Uerqvq说道:

    tadalafil 40mg oral cialis 20mg brand buy sildenafil 100mg pills

  78. Kuwxzy说道:

    brand micardis 20mg buy hydroxychloroquine 400mg generic cost molnupiravir 200mg

  79. Mbybsq说道:

    buy prilosec paypal buy generic prilosec over the counter buy lopressor pill

  80. Nxwrrh说道:

    buy premarin 0.625mg generic purchase sildenafil without prescription sildenafil 100mg pills

  81. Jwboar说道:

    betahistine 16 mg price cheap latanoprost generic benemid 500 mg

  82. Eqrbmc说道:

    how to get zovirax without a prescription xeloda ca buy exelon 6mg generic

  83. Creoyr说道:

    buy generic vasotec 5mg enalapril 5mg pills duphalac ca

  84. Yghhrh说道:

    ferrous sulfate 100mg generic order betapace order generic betapace 40mg

  85. Averuv说道:

    prasugrel over the counter cost prasugrel 10 mg how to get detrol without a prescription

  86. Nvunvx说道:

    order monograph 600mg online cheap buy cilostazol 100 mg sale buy generic cilostazol for sale

  87. Oukxnn说道:

    fludrocortisone 100mcg over the counter order fludrocortisone 100mcg without prescription brand loperamide 2 mg

  88. Ewqsta说道:

    buy dydrogesterone 10mg buy dydrogesterone cheap buy empagliflozin paypal

  89. Qhpdni说道:

    order melatonin 3mg pills buy aygestin 5mg danocrine 100mg cost

  90. Ycqlfo说道:

    dipyridamole 25mg oral order dipyridamole 25mg for sale buy generic pravastatin for sale

  91. Wbwhuc说道:

    order aspirin 75mg pills aspirin 75 mg ca buy generic imiquad over the counter

  92. Itbplv说道:

    brand acarbose 25mg acarbose 50mg tablet order fulvicin 250mg generic

  93. Pnddcu说道:

    buy mintop solution pills for erection buy ed medications online

  94. Ktwptr说道:

    how to get zaditor without a prescription cheap zaditor cheap imipramine 25mg

  95. Vuxcix说道:

    tadalafil online order order viagra online viagra 50mg generic

  96. Etevxw说道:

    order fenofibrate online tricor 200mg generic tricor 200mg cheap

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

CAPTCHAis initialing...