Redshift下如何在数据库中创建表?遇到库已存在/schema不存在报错怎么处理
报错原因分析
- 第一个报错:你尝试重复创建已经存在的
Cricket数据库,触发了唯一性校验报错。 - 第二个报错:注释建库语句后,你没有切换到已存在的
Cricket数据库的操作上下文,部分数据库(如MySQL)会将Cricket.First_Table中的Cricket识别为schema名,当前默认操作的库下没有对应schema就会触发不存在报错。另外你提供的原始建表语句存在语法错误:多个字段定义末尾漏写逗号,即便解决库/schema的问题也会执行失败。
正确操作步骤
通用解决逻辑
- 建库语句加上
IF NOT EXISTS判断,避免重复创建报错 - 建表前先切换到对应数据库的操作上下文,或者调整schema的创建逻辑匹配你写的表名前缀
- 修正建表语句中漏写的逗号
MySQL环境示例代码
-- 安全创建库,不存在才执行,避免已存在报错 CREATE DATABASE IF NOT EXISTS Cricket; -- 切换到Cricket数据库的操作上下文 USE Cricket; -- 修正语法后的建表语句 CREATE TABLE First_Table ( Player varchar(30) default 'Abhay Saini', Runs integer(20) default '-1', Minutes integer(10) default '-1', Batted_Flag integer(10) default '-1', Not_Out integer(10) default '-1', Balls integer(10) default '-1', Fours integer(10) default '-1', Sixes integer(10) default '-1', Strike_Rate integer(10) default '-1', Innings integer(10) default '-1', Opposition varchar(20) default '-1', Ground varchar(20) default 'Panchkula', Date date default '1901-01-01', Country varchar(20) default 'Vatican', Fifties integer(10) default '-1', Hundreds integer(10) default '-1' );
PostgreSQL环境特殊说明
PostgreSQL的数据库和schema是两层独立结构,如果你要保留Cricket.First_Table的表名写法,不需要单独创建Cricket数据库,直接在当前操作的数据库下创建同名schema即可:
-- 安全创建schema CREATE SCHEMA IF NOT EXISTS Cricket; -- 建表,字段定义使用上面修正后的版本即可 CREATE TABLE Cricket.First_Table ( Player varchar(30) default 'Abhay Saini', Runs integer(20) default '-1', Minutes integer(10) default '-1', Batted_Flag integer(10) default '-1', Not_Out integer(10) default '-1', Balls integer(10) default '-1', Fours integer(10) default '-1', Sixes integer(10) default '-1', Strike_Rate integer(10) default '-1', Innings integer(10) default '-1', Opposition varchar(20) default '-1', Ground varchar(20) default 'Panchkula', Date date default '1901-01-01', Country varchar(20) default 'Vatican', Fifties integer(10) default '-1', Hundreds integer(10) default '-1' );
内容的提问来源于stack exchange,提问作者zenith
相关产品推荐
相关产品推荐

