【问题标题】:MySQL: Is there a way to insert values from one table to another?MySQL:有没有办法将值从一个表插入到另一个表?
【发布时间】:2015-03-08 20:58:53
【问题描述】:

我创建了一个名为employee的表

CREATE TABLE employee(
     id INT,
     name VARCHAR(50),
     credit_card_number VARCHAR(20),
     expr_date CHAR(6),
     PRIMARY KEY(id)
)

然后我有一个存储信用卡信息的表

CREATE TABLE credit_card (
     credit_card_number VARCHAR(20),
     expr_date CHAR(6),
     o_datetime DATETIME
)

我想编写一个插入语句,将每个员工当前存储的信用卡信息插入到我的新信用卡表中。我还想用当前日期时间填写我的o_datetime

这就是我最初的处理方式,但我不确定我这样做是否正确..

INSERT INTO credit_card(credit_card_number, expr_date, CURRENT_TIMESTAMP AS o_datetime)
SELECT credit_card_number, expr_date
FROM employees;

但是当我运行它时出现错误。我对 SQL 很陌生,所以我可能错过了一个简单的步骤,但我似乎无法弄清楚。

【问题讨论】:

  • “但是当我运行这个时我得到一个错误”---我们需要猜测吗?但显然是列数。您正在尝试插入 3 列并仅选择 2 列。

标签: mysql sql insert-select


【解决方案1】:

首先,您不应该将未加密的信用卡号存储在数据库中。这是邀请某人“借用”这些号码。您可以散列它们或以其他方式存储它们以防止未经授权的访问。

您的语句的问题是o_datetime 组件。默认值可以放在select 语句中:

INSERT INTO credit_card(credit_card_number, expr_date, o_datetime)
    SELECT credit_card_number, expr_date, CURRENT_TIMESTAMP
    FROM employees;

但是,如果您总是希望这是插入数据的日期,您可以将其设为默认值:

CREATE TABLE credit_card (
     credit_card_number VARCHAR(20),
     expr_date CHAR(6),
     o_datetime DATETIME default CURRENT_TIMESTAMP
)

那么你可以这样做:

INSERT INTO credit_card(credit_card_number, expr_date)
    SELECT credit_card_number, expr_date
    FROM employees;

请注意,在旧版本的 MySQL 中,o_datetime 需要是 timestamp

【讨论】:

  • “你永远不应该在数据库中存储未加密的信用卡号码”——一般建议是永远不要存储它们,因为它“违反”PCI(引用因为它不是但如果有人问这样的问题——那么它们肯定不符合它的要求)。
  • 是的。你在哪家公司工作?我不想从你这里买任何东西。
【解决方案2】:

应该是这样的:

INSERT INTO credit_card(credit_card_number, expr_date, o_datetime)
SELECT credit_card_number, expr_date, CURRENT_TIMESTAMP
FROM employee;

您需要定义插入的第三列,在这种情况下,CURRENT_TIMESTAMP 代表o_datetime

【讨论】:

  • 我尝试运行此程序,但我收到一条错误消息,提示我的表“credit_card”已存在。奇怪..
  • @Kara -- 为我工作,看看张贴的小提琴,让我知道出了什么问题......顺便说一句 -- 你正在创建一个 employee 表,但在你的 @ 中调用 employees 987654327@ 声明。
【解决方案3】:

您的语法不正确。 into 子句之后的列表只能包含列名。所有值(即使是常量或函数返回值)都必须在select 列表中给出:

INSERT INTO credit_card(credit_card_number, expr_date, o_datetime)
SELECT      credit_card_number, expr_date, CURRENT_TIMESTAMP
FROM        employees; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2021-10-19
    • 2014-08-12
    相关资源
    最近更新 更多