Fork me on GitHub
Fork me on GitHub

MySQL DML

DML

  • DDL
    • DATABASE
    • TABLE
    • VIEW
  • DML
    • SELECT
    • INSERT/REPLACE
    • UPDATE
    • DELETE

INSERT/REPLACE


INSERT INTO:(INTO可以省略)
第一种:

INSERT INTO tb_name [(col1, col2,...)] {VALUES|VALUE} (val1, val2,...)[,(val21,val22,...),...]      
    ——VALUE插入单行数据,VALUES插入多行数据。二者取其一,必选的。

第二种:

INSERT INTO tb_name SET col1=val1, col2=val2, ...
    ——大多数情况下用于插入一行数据。有点类似于UPDATE。

第三种:

INSERT INTO tb_name SELECT clause
    ——查询的结果要和插入的表的字段类型、字段个数保持一致。

REPLACE的工作机制:与INSERT相同,除了在新插入的数据与表中的主键数据相同或与惟一索引定义的数据相同会替换老的行。
也是和INSERT一样3种使用方式。

UPDATE

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1=val1 [, col_name2=val2] ...
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

UPDATE通常情况下,必须要使用WHERE子句,或者使用LIMIT限制要修改的行数;否则就每行都修改了,不安全。

--safe-updates     

启动mysqld还有这个选项,可用于限定如果你的DELETE语句忘记了带WHERE子句或LIMIT子句时是拒绝执行的。这个选项还包括对DELETE语句的限制。建议启动时使用–safe-updates。

DELETE

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

如果对删除哪些行不做限定的话,非常危险。是删除行,不是删字段。不指定条件,就是清空表数据。

TRUNCATE tb_name

如果我们的目的是清空整张表的话,delete有个问题:如果这个表中有自动增长的字段,它那个自动增长的数值不会重置为1。我们需要使用TRUNCATE,不要使用delete。所以如果我们是想清空某张表的话,请使用TRUNCATE。
事实上我们还建议,复制表结构,然后把原来的表删除掉,即DROP。创建表结构,在插入原表数据。

以上的SELECT、INSERT、UPDATE和DELETE在NoSQL中被称为crud。