在INSERT语句中执行SELECT语句的SQL是什么?

时间:2015-02-22 15:46:33

标签: mysql sql database

我的MySQL数据库中有以下表格:

CREATE TABLE user_role (
    user_role_id INT UNSIGNED AUTO_INCREMENT,
    user_role VARCHAR(15) NOT NULL,
    CONSTRAINT pk_user_role PRIMARY KEY (user_role_id)
);

CREATE TABLE users (
    user_id INT UNSIGNED AUTO_INCREMENT,
    user_role_id INT UNSIGNED NOT NULL,
    email VARCHAR(254) NOT NULL,
    password VARCHAR(255) NOT NULL,
    CONSTRAINT pk_users PRIMARY KEY (user_id),
    CONSTRAINT fk1_users FOREIGN KEY (user_role_id) REFERENCES user_role (user_role_id),
    CONSTRAINT unq1_users UNIQUE (email)
);

假设所有用户角色都已存在,如何在一个语句中插入具有正确用户角色ID(即SELECT user_role_id WHERE user_role = 'role';)的新用户?

我在以下问题中尝试过这个问题,但这对我没有用处:INSERT INTO with SubQuery MySQL

2 个答案:

答案 0 :(得分:3)

假设所有用户角色已经存在,您可以使用此查询在一个语句中插入具有正确用户角色ID的新用户(即SELECT user_role_id WHERE user_role ='role';):

insert into users (user_role_id, email, password)
select 
    user_role_id,
    'new_user',
    'password_hash'
from user_role r
where r.user_role='role'
limit 1;

答案 1 :(得分:0)

如果子查询在值列表中工作,您可以尝试下面的第一个选项,但我怀疑他们没有。我也假设冒号是连接的参数标记,因为。

insert into users (user_id, user_role_id, email, password)
values (
    :user_id,
    (select user_role_id from user_role where user_role = 'role'),
    :email,
    :password
)

另一种选择:

insert into users (user_id, user_role_id, email, password)
select
    :user_id,
    (select user_role_id from user_role where user_role = 'role'),
    :email,
    :password
--from dual or some other dummy table??
尽管我不知道为什么limit 1应该是必要的,但是ASh的回答可能很有效。在这种情况下,你有两个同名的角色,你不知道哪一个回来了。