mysql里面的insert语句的values值为一句select语句的sql时转换成oracl

mysql里面的insert语句的values值为一句select语句的sql时转换成oracl,第1张

VALUES 语句

具体语法:VALUES row_constructor_list[ORDER BY column_designator][LIMIT BY number] row_constructor_list:ROW(value_list)[, ROW(value_list)][, ...]value_list:value[, value][, ...]column_designator:column_index

VALUES 语句,用做功能展示或者快速造数据场景,结果列名字以 COLUMN_0 开头,以此类推,举个简单例子。单条 VALUES 语句mysql-(ytt/3305)->values row(1,2,3)+----------+----------+----------+| column_0 | column_1 | column_2 |+----------+----------+----------+|1|2|3|+----------+----------+----------+1 row inset(0.00 sec)

多条 VALUES 语句mysql-(ytt/3305)->values row(1,2,3),row(10,9,8)+----------+----------+----------+| column_0 | column_1 | column_2 |+----------+----------+----------+|1 |2 |3 || 10 |9 |8 |+----------+----------+----------+2 rows in set (0.00 sec)

多条 VALUES 联合 UNION ALLmysql-(ytt/3305)->values row(1,2,3),row(10,9,8) union all values \row(-1,-2,0),row(10,29,30),row(100,20,-9)+----------+----------+----------+| column_0 | column_1 | column_2 |+----------+----------+----------+|1 |2 |3 || 10 |9 |8 || -1 | -2 |0 || 10 | 29 | 30 || 100 | 20 | -9 |+----------+----------+----------+5 rows in set (0.00 sec)

根据字段下标排序,从 1 开始mysql-(ytt/3305)->values row(1,2,3),row(10,9,8) union all values \row(-1,-2,0),row(10,29,30),row(100,20,-9) order by 1 desc +----------+----------+----------+| column_0 | column_1 | column_2 |+----------+----------+----------+| 100 | 20 | -9 || 10 |9 |8 || 10 | 29 | 30 ||1 |2 |3 || -1 | -2 |0 |+----------+----------+----------+5 rows in set (0.00 sec)

类型可以任意组合:bit,json,datetime,int,decimal 等mysql-(ytt/3305)->values row(100,200,300),\row('2020-03-10 12:14:15','mysql','test'), \row(16.22,TRUE,b'1'), \row(left(uuid(),8),'{"name":"lucy","age":"28"}',hex('dble'))+---------------------+----------------------------+--------------------+| column_0| column_1 | column_2 |+---------------------+----------------------------+--------------------+| 100 | 200| 0x333030 || 2020-03-10 12:14:15 | mysql | 0x74657374 || 16.22 | 1 | 0x01 || c86fd1a7| {"name":"lucy","age":"28"} | 0x3634363236433635 |+---------------------+----------------------------+--------------------+4 rows in set (0.00 sec)

新建表 t3,把刚才这些记录写进去mysql-(ytt/3305)->create table t3 (r1 varchar(100),r2 varchar(100),r3 varchar(100))Query OK, 0 rows affected (0.02 sec)

写入到表 t3mysql-(ytt/3305)->insert into t3 values row(100,200,300), \row('2020-03-10 12:14:15','mysql','test'), \row(16.22,TRUE,b'1'),\row(left(uuid(),8),'{"name":"lucy","age":"28"}',hex('dble'))Query OK, 4 rows affected (0.00 sec)Records: 4 Duplicates: 0 Warnings: 0

可能原因:1、values () 内的内容是不是同表的字段数量保持一致2、LAST_INSERT_ID() 是否有值,LAST_INSERT_ID() 是上次自动增长列插入的数据返回的id值 你写的这个语句思路,给表的主键加个自动增长的属性就可以了,没必要这样写吧

1. 基础的Insert语句示例

下面的语句向员工表插入一条新记录。在这个例子中,后的“values”指定要插入到表中的所有字段对应的值。

INSERT INTO employee VALUES(100,'Thomas','Sales',5000)

用SELECT语句来验证数据是否插入成功。

SELECT * FROM employee

2. 只针对选定的字段插入值

如果你只想向选定的字段插入值,你需要在INSERT语句中明确指定要插入的字段名字。 下面的代码仅插入id和name列的数据

INSERT INTO employee(id,name) VALUES(200,'Jason')

以上代码中,我们未对dept和salary列指定任何值。所以,以上两个字段的值为NULL,当我们用SELECT语句检索数据时。需要注意的是,NULL不是指"NULL"字符串,SELECT语句使用"NULL"来表示这个字段的值是空的而已。

mysql>SELECT * FROM employee+-----+--------+-------+--------+| id | name | dept | salary |+-----+--------+-------+--------+| 100 | Thomas | Sales | 5000 || 200 | Jason | NULL | NULL |+-----+--------+-------+--------+2 rows in set (0.00 sec)

3. INSERT SET示例

INSERT语句不仅仅可以使用"VALUE"关键字,也可以使用"SET"关键字。下面的例子与上面的例子结果一样,但是使用的是SET关键字。

mysql>INSERT INTO employee SET id=300, name='Mayla'mysql>select * from employee+-----+--------+-------+--------+| id | name | dept | salary |+-----+--------+-------+--------+| 100 | Thomas | Sales | 5000 || 200 | Jason | NULL | NULL || 300 | Mayla | NULL | NULL |+-----+--------+-------+--------+

4.从另一个表中检索数据插入

下面的例子中,我们会使用INSERT ... SELECT语句,这个语句可以从其他表中检索数据,并插入到目标表。 下面的代码从Contractor表中检索所有数据并插入到Employee表。

INSERT INTO employee SELECT * FROM contractor

SELECT语句中可以根据需要使用WHERE子句,用来检索需要的从Contractor表插入到Employee表的数据。

INSERT INTO employee SELECT * FROM contractor WHERE salary >= 7000

注意:如果你使用oracle数据库,你的SQL应该这样写"INSERT INTO employee AS SELECT * FROM contractor"。需要注意在MySQL中不适用AS关键字。

5.从其他表中选择部分字段插入

当然,你也可以从其他表中选择部分字段的数据插入到你的表中。 下面的例子将从contractor表中选择id,name字段的所有数据插入到employee表。

INSERT INTO employee(id,name) SELECT id,name FROM contractor

跟前面的例子一样,可以使用WHERE子句过滤数据。

INSERT INTO employee(id,name) SELECT id,name FROM contractor WHERE salary >= 7000

注意:如果employee表中已存在相同主键(这里的主键是id)的记录,你会得到一条错误信息。下面是一个示例错误信息,指出employee表中已经存在id为100的记录。

ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY'

6. 插入数据到指定分区

如果创建了分区表(分区类型为range)并希望将输入插入到指定分区,可以参考下面代码。 将数据插入到分区p1中的employee表。

INSERT INTO employee PARTITION (p1) VALUES(100,'Thomas','Sales',5000)

注意:如果该分区的employee表中已包含相应的数据(这里是id=100的employee数据),你会得到如下错误信息。

ERROR 1729 (HY000): Found a row not matching the given partition set

注意: 分区仅在MySQL5.6及以上版本可用。

7. 插入数据到多个分区

可以使用单条SQL语句将数据插入到多个分区。下面的INSERT语句将id为100的记录插入到p1分区,将id为200的记录插入到p2分区。

INSERT INTO employee PARTITION (p1, p2) VALUES(100,'Thomas','Sales',5000), (200,'Jason','Technology',5500)

注意: 在上例中,如果MySQL往任意分区插入数据失败,那么整个INSERT语句将失败。当然,这同样仅能在MySQL5.6及以上版本使用。

8. 在插入过程中忽略错误

在一些场景中(比如:批处理),你可能希望忽略插入过程中MySQL产生的错误信息,你可以使用INSERT IGNORE语句。 比如:下面的例子会抛出错误信息,提示数据已经存在。

mysql>INSERT INTO employee VALUES(100,'Thomas','Sales',5000)ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY'

要忽略上面的错误信息,可以使用INSERT IGNORE来替换INSERT语句(执行前请确保这条对应的主键已经存在)。

mysql>INSERT IGNORE INTO employee VALUES(100,'Thomas','Sales',5000)Query OK, 0 rows affected (0.00 sec)

INSERT IGNORE仅仅只是忽略错误信息,不会进行其他任何处理。

9. INSERT语句的默认值

如果MySQL运行在strict模式下,并且在我们的INSERT语句中并未指定默认值,那么MySQL将抛出错误信息。 不过,如果MySQL并未启用strict模式(这个是默认启用的)时,同时INSERT语句没有为字段指定值,那么MySQL会为该字段使用字段类型的默认值。 比如,bonus表的所有字段都不允许为空(not null)。

mysql>DESC bonus+--------+---------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+--------+---------+------+-----+---------+-------+| id | int(11) | NO | | NULL| || amount | int(11) | NO | | NULL| |+--------+---------+------+-----+---------+-------+

我们先执行以下语句,插入一条数据(id=100)

INSERT INTO bonus(id) VALUES(100)

查看刚插入的数据,可以看到amount字段被设置为默认值0

SELECT * FROM bonus+-----+--------+| id | amount |+-----+--------+| 100 | 0 |+-----+--------+

如果,SQL语句中同时不指定id和amount字段的值,那么他们都会被自动设置为默认值0。参考下面例子。

INSERT INTO bonus VALUES()mysql>select *


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/6136460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-16
下一篇 2023-03-16

发表评论

登录后才能评论

评论列表(0条)

保存