SQL——9、创建、删除、更改 表
1、创建表
当您有新的实体和关系要存储在数据库中时,使用该CREATE TABLE语句创建一个新的数据库表。
创建带有可选表约束和默认值的表语句
CREATE TABLE IF NOT EXISTS mytable (
column DataType TableConstraint DEFAULT default_value,
another_column DataType TableConstraint DEFAULT default_value,
… );
小贴士?
表:列名,数据类型,表约束。
新表的结构由它的表模式定义,它定义了一系列列。每列都有一个名称、该列中允许的数据类型、插入值的可选表约束以及可选的默认值。如果已经存在同名的表,SQL 实现通常会抛出错误,因此如果存在表,则要抑制错误并跳过创建表,可以使用该IF NOT EXISTS子句。
表数据类型
不同的数据库支持不同的数据类型,但常见的类型支持数字、字符串和其他杂项,如日期、布尔值甚至二进制数据。以下是一些您可能会在实际代码中使用的示例。
数据类型 |
描述 |
INTEGER,BOOLEAN |
整数数据类型可以存储整数值,例如数字或年龄的计数。在某些实现中,布尔值仅表示为 0 或 1 的整数值。 |
FLOAT, DOUBLE,REAL |
浮点数据类型可以存储更精确的数值数据,如测量值或小数值。根据该值所需的浮点精度,可以使用不同的类型。 |
CHARACTER(num_chars), VARCHAR(num_chars), TEXT |
基于文本的数据类型可以在各种语言环境中存储字符串和文本。在使用这些列时,各种类型之间的区别通常相当于数据库的底层效率。 CHARACTER 和 VARCHAR(可变字符)类型都指定了它们可以存储的最大字符数(更长的值可能会被截断),因此可以更有效地存储和查询大表。 |
DATE,DATETIME |
SQL 还可以存储日期和时间戳以跟踪时间序列和事件数据。使用它们可能会很棘手,尤其是在跨时区操作数据时。 |
BLOB |
最后,SQL 可以将二进制数据存储在数据库中的 blob 中。这些值通常对数据库是不透明的,因此您通常必须将它们与正确的元数据一起存储以重新查询它们。 |
文档: MySQL,Postgres,SQLite,Microsoft SQL Server。
表约束
在本课中,我们不会深入研究表约束,但每一列都可以有额外的表约束,这些约束限制了可以插入该列的值。这不是一个完整的列表,但会显示一些您可能会发现有用的常见约束。
约束 |
描述 |
PRIMARY KEY |
主键,这意味着该列中的值是唯一的,每个值都可以用来标识该表中的一行。 |
AUTOINCREMENT |
对于整数值,这意味着该值会随着每行插入而自动填充和递增。并非所有数据库都支持。 |
UNIQUE |
这意味着该列中的值必须是唯一的,因此您不能在该列中插入与表中的另一行具有相同值的另一行。与 `PRIMARY KEY` 的不同之处在于它不必是表中行的键。 |
NOT NULL |
这意味着插入的值不能为 `NULL`。 |
CHECK (expression) |
这允许您运行更复杂的表达式来测试插入的值是否有效。例如,您可以检查值是否为正数,或大于特定大小,或以某个前缀开头等。 |
FOREIGN KEY |
外键,这是一种一致性检查,可确保该列中的每个值对应于另一个表中的列中的另一个值。 |
一个例子
这是迄今为止我们在课程中一直使用的Movies表的示例模式。
电影表架构
CREATE TABLE movies (
id INTEGER PRIMARY KEY,
title TEXT,
director TEXT,
year INTEGER,
length_minutes INTEGER );
2、更改表
更新相应表和数据库模式的方法,方法是使用ALTER TABLE语句添加、删除或修改列和表约束。
添加列:添加新列的语法类似于在CREATE TABLE 语句中创建新行时的语法。您需要指定列的数据类型以及要应用于现有行和新行的任何潜在表约束和默认值。在某些数据库(如 MySQL)中,您甚至可以使用FIRST or AFTER子句指定插入新列的位置,尽管这不是标准功能
更改表以添加新列
ALTER TABLE mytable
ADD column DataType OptionalTableConstraint DEFAULT default_value;
删除列:某些数据库(包括 SQLite)不支持此功能。相反,您可能必须创建一个新表并将数据迁移过来。
更改表以删除列
ALTER TABLE mytable
DROP column_to_be_deleted;
重命名表:如果您需要重命名表本身,您也可以使用RENAME TO语句的子句来完成。
更改表名
ALTER TABLE mytable
RENAME TO new_table_name;
其他变化:每个数据库实现都支持更改其表的不同方法,因此最好在继续之前查阅您的数据库文档。
3、删除表
在极少数情况下,您可能希望删除整个表,包括其所有数据和元数据,为此,您可以使用该DROP TABLE语句,该语句与该DELETE语句的不同之处在于它还从数据库中完全删除了表模式。
删除表语句
DROP TABLE IF EXISTS mytable;
小贴士?
此外,如果您有另一个表依赖于要删除的表中的列(例如,具有FOREIGN KEY依赖项),那么您必须先更新所有依赖表以删除依赖行或完全删除这些表。
一、创建表
版权声明:本文为CSDN博主「风中凌乱的小精灵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shujian_tianya/article/details/81060597
1.基本表定义格式
CREATE TABLE 表名(
列名 数据类型 列级完整性约束条件,
列名 数据类型 列级完整性约束条件,
......
列名 数据类型 列级完整性约束条件,
表级完整性约束条件
);
2.注意
定义表格的时候注意主码和外码的确定和定义方式,注意每个变量类型和长度的定义。
3.实例
1 CREATE TABLE Region(/*地区表*/ 2 regionkey INTEGER PRIMARY KEY, /*地区编号*/ 3 name CHAR(25), /*地区名称*/ 4 comment CHAR(152) /*备注*/ 5 ); 6 7 CREATE TABLE Nation(/*国家表*/ 8 nationkey INTEGER PRIMARY KEY, /*国家编号*/ 9 name CHAR(25), /*国家名称*/ 10 regionkey INTEGER REFERENCES Region(regionkey), /*地区编号*/ 11 comment VARCHAR(152) /*备注*/ 12 ); 13 14 CREATE TABLE Supplier(/*供应商基本表*/ 15 suppkey INTEGER PRIMARY KEY, /*供应商编号*/ 16 name CHAR(50), /*供应商名称*/ 17 address VARCHAR(80), /*供应商地址*/ 18 nation INTEGER REFERENCES Nation(nationkey), /*国家编号*/ 19 phone CHAR(30), /*供应商电话*/ 20 acctbal REAl, /*账户余额*/ 21 comment VARCHAR(101) /*备注*/ 22 ); 23 24 CREATE TABLE Part(/*零件基本表*/ 25 partkey INTEGER PRIMARY KEY, /*零件编号*/ 26 name VARCHAR(100), /*零件名称*/ 27 mfgr CHAR(50), /*制造厂*/ 28 brand VARCHAR(50), /*品牌*/ 29 type VARCHAR(25), /*零件类型*/ 30 size INTEGER, /*尺寸*/ 31 container CHAR(10), /*包装*/ 32 retailprice REAL, /*零售价格*/ 33 comment VARCHAR (23) /*备注*/ 34 ); 35 36 CREATE TABLE PartSupp(/*零件供应联系表*/ 37 partkey INTEGER REFERENCES Part(partkey), /*零件编号*/ 38 suppkey INTEGER REFERENCES Supplier(suppkey), /*供应商编号*/ 39 availqty INTEGER, /*可用数量*/ 40 supplycost REAL, /*供应价格*/ 41 comment VARCHAR(199), /*备注*/ 42 PRIMARY KEY(partkey,suppkey) /*定义主码*/ 43 ); 44 45 CREATE TABLE Customer(/*顾客表*/ 46 custkey INTEGER PRIMARY KEY, /*顾客编号*/ 47 name VARCHAR(25), /*姓名*/ 48 address VARCHAR(40), /*地址*/ 49 nationkey INTEGER REFERENCES Nation(nationkey), /*国籍编号*/ 50 phone CHAR(15), /*电话*/ 51 acctbal CHAR(10), /*账户余额*/ 52 mktsegment CHAR(10), /*市场分区*/ 53 comment VARCHAR(117), /*备注*/ 54 ); 55 56 CREATE TABLE Orders(/*订单表*/ 57 orderkey INTEGER PRIMARY KEY, /*订单编号*/ 58 custkey INTEGER REFERENCES Customer(custkey), /*顾客编号*/ 59 orderstatus CHAR(1), /*订单状态*/ 60 totalprice REAL, /*订单总金额*/ 61 orderdate DATE, /*订单日期*/ 62 orderpriority CHAR(15), /*订单优先级别*/ 63 clerk CHAR(15), /*记账员*/ 64 shippriority INTEGER , /*运输优先级别*/ 65 comment VARCHAR(79), /*备注*/ 66 ); 67 68 CREATE TABLE Lineitem(/*订单明细表*/ 69 orderkey INTEGER REFERENCES Orders(orderkey), /*订单编号*/ 70 partkey INTEGER REFERENCES Part(partkey), /*零件编号*/ 71 suppkey INTEGER REFERENCES Supplier(suppkey), /*供应商编号*/ 72 linenumber INTEGER, /*订单明细编号*/ 73 quantity REAL, /*数量*/ 74 expendedprice REAL, /*订单明细价格*/ 75 discount REAL, /*折扣*/ 76 tax REAL, /*税率*/ 77 returnflag CHAR(1), /*退货标记*/ 78 linestatus CHAR(1), /*订单明细状态*/ 79 shipdate DATE, /*装运日期*/ 80 commidate DATE, /*委托日期*/ 81 receipdate DATE, /*签收日期*/ 82 shipinstruct CHAR(25), /*装运说明*/ 83 shipmode CHAR(10), /*装运方式*/ 84 comment VARCHAR(44), /*备注*/ 85 PRIMARY KEY(orderkey,linenumber), 86 FOREIGN KEY(partkey,suppkey)REFERENCES PartSupp(partkey,suppkey), 87 );