数据的插入mysql
INSERT插入数据sql
😀 插入完整的行; 😀 插入行的一部分; 😀 插入多行; 😀 插入某些查询的结果。数据库
INSERT into Customers values(NULL, 'Pep E. LaPew', '100 Main Street' 'Los Angeles' 'CA' '90046' 'USA' NULL, NULL)
INSERT LOW_PRIORITY INTO Customers(#priority 下降优先级 cust_name. cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email ) values( 'Pep E. LaPew', '100 Main Street' 'Los Angeles' 'CA' '90046' 'USA' NULL, NULL)
插入多条行函数
INSERT LOW_PRIORITY INTO Customers(#priority 下降优先级 cust_name. cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email ) values( 'Pep E. LaPew', '100 Main Street' 'Los Angeles' 'CA' '90046' 'USA' NULL, NULL), ( 'Pep E. LaPew', '100 Main Street' 'Los Angeles' 'CA' '90046' 'USA' NULL, NULL )
INSERT SELECT工具
这个例子把一个名为 custnew 的表中的数据导入 customers 表中。为了试验这个例子,应该首先建立和填充 custnew 表custnew 表的结构与附录B中描述的 customers表的相同。在填充 custnew 时,不该该使用已经在 customers中使用过的cust_id 值(若是主键值重复,后续的 INSERT 操做将会失败)或仅省略这列值让MySQL在导入数据的过程当中产生新值。性能
INSERT INTO customers( cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) SELECT cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country FROM custnew;
INSERT SELECT 中的列名 为简单起见,这个例子在 INSERT 和SELECT 语句中使用了相同的列名。可是,不必定要求列名匹配。事实上,MySQL甚至不关心 SELECT 返回的列名。它使用的是列的位置,所以 SELECT 中的第一列(无论其列名)将用来填充表列中指定的第一个列,第二列将用来填充表列中指定的第二个列,如此等等。这对于从使用不一样列名的表中导入数据是很是有用的。测试
😋 更新表中特定行; 😋 更新表中全部行。spa
the first examplecode
UPDATE IGNORE customers # ignore 忽略错误 继续更新 SET cust_email = NULL, cust_name = 'The Fudds' WHERE cust_id = 10005; # 注意不要忘了where 不然可能更新所有
DELETE FROM customers WHERE cust_id = 10006;
DELETE 不须要列名或通配符。 DELETE 删除整行而不是删除列。为了删除指定的列,请使用 UPDATE 语句。事务
删除表的内容而不是表 DELETE 语句从表中删除行,甚至是删除表中全部行。可是, DELETE 不删除表自己。
更快的删除 若是想从表中删除全部行,不要使用DELETE 。可以使用 TRUNCATE TABLE 语句,它完成相同的工做,但速度更快( TRUNCATE 实际是删除原来的表并从新建立一个表,而不是逐行删除表中的数据)。truncate table
😘 除非确实打算更新和删除每一行,不然绝对不要使用不带 WHERE 子句的 UPDATE 或 DELETE 语句。 😘 保证每一个表都有主键(若是忘记这个内容,请参阅第15章),尽量 像 WHERE 子句那样使用它(能够指定各主键、多个值或值的范围)。 😘 在对 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT 进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。 😘 使用强制实施引用完整性的数据库(关于这个内容,请参阅第15 章),这样MySQL将不容许删除具备与其余表相关联的数据的行。
为了用程序建立表,可以使用SQL的 CREATE TABLE 语句。值得注意的 是,在使用交互式工具时,实际上使用的是MySQL语句。可是,这些语 句不是用户编写的,界面工具会自动生成并执行相应的MySQL语句(更 改现有表时也是这样)。
create table
CREATE TABLE customers IF NOT EXISTS #if not exists不存在的时候建立该表 ( cust_id int NOT NULL AUTO_INCREMENT, cust_name char(50) NOT NULL, cust_address char(50) NULL, cust_city char(50) NULL, cust_state char(5) NULL, cust_zip char(10) NULL, cust_country char(50) NULL, cust_contact char(50) NULL, cust_email char(255) NULL, PRIMARY KEY (cust_id) #primary key 主键 )ENGINE=InnoDB; # auto_increment
肯定 AUTO_INCREMENT 值 让MySQL生成(经过自动增量)主 键的一个缺点是你不知道这些值都是谁。 考虑这个场景:你正在增长一个新订单。这要求在 orders 表中建立一行,而后在 orderitms 表中对订购的每项物品建立一行。order_num 在 orderitems 表中与订单细节一块儿存储。这就是为何 orders 表和 orderitems 表为相互关联的表的缘由。这显然要求你在插入 orders 行以后,插入 orderitems 行以前知道生成的 order_num 。那么,如何在使用AUTO_INCREMENT 列时得到这个值呢?可以使用 last_insert_id() 函数得到这个值,以下所示: SELECT last_insert_id() 此语句返回最后一个 AUTO_INCREMENT 值,而后能够将它用于 后续的MySQL语句。
指定默认值
CREATE TABLE orderitems ( order_num int NOT NULL, order_item int NOT NULL, prod_id char(10) NOT NULL, quantity int NOT NULL DEFAULT 1,#default item_price decimal(8,2) NOT NULL, PRIMARY KEY (order_num,order_item) ) ENGINE=InnoDB; #选择引擎 engine =
😄 InnoDB 是一个可靠的事务处理引擎(参见第26章),它不支持全文本搜索; 😄 MEMORY 在功能等同于 MyISAM ,但因为数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表); 😄 MyISAM 是一个性能极高的引擎,它支持全文本搜索(参见第18章),但不支持事务处理。
ALTER TABLE
ALTER TABLE vendors #alter table ADD vend_phone CHAR(20);
ALTER TABLE vendors DROP COLUMN vend_phone; # drop column
定义外键
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREING KEY (order_num) REFERENCES orders (order_num); #add constraint 约束 foreing 外来物 refernces 参考文献 ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREING KEY (order_id) REFERENCES orders (order_id); ALTER TABLE orders ADD CONSTRAINT fk_orderitems_customers FOREING KEY (order_id) REFERENCES orders (order_id); ALTER TABLE products ADD CONSTRAINT fk_orderitems_vendors FOREING KEY (order_id) REFERENCES orders (order_id);
DROP TABLE customers2;
RENAME TABLE customers2 TO customers;