【问题标题】:Create Table (new columns) and columns from different table创建表(新列)和来自不同表的列
【发布时间】:2019-10-28 03:58:25
【问题描述】:

例如。我有 1 张桌子 表的名称是Suppliers 包含:

 1. SupplierName
 2. SupplierID

我想创建另一个新表名Contracts 其中包含

的新列
 1. ContractID (new column)
 2. SupplierID(from "Suppliers" table)
 3. ContractValue (new column)

我该怎么做?

我进行了研究,他们中的大多数人告诉我使用创建表然后选择,但它不会起作用,我也尝试过改变表但仍然不起作用。

CREATE TABLE Contracts (
  ContractID INT NOT NULL, 
SELECT SupplierID 
FROM Suppliers,
  ContractValue INT NOT NULL, 
  ContractStart DATE NOT NULL)

这些代码不起作用,所以我不确定解决方案是什么。

CREATE TABLE Contracts (
  ContractID INT NOT NULL, 
(SELECT SupplierID 
FROM Suppliers),
  ContractValue INT NOT NULL, 
  ContractStart DATE NOT NULL)

我希望结果是带有ContractID(新列)、SupplierID(来自表Suppliers)和另一个名为ContractValue 的新列的新表

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    将 Select 查询结果集视为表或数据网格。

    所以“SELECT [some fields] FROM [some table]”返回数据网格,其中每一行都包含表中的一些字段。

    因此,您可以将表定义为带有数据的选择查询,或者指定结构并创建空表。您很可能不想混合使用这两种方法。

    在您的情况下,合同表的 SupplierID 字段是对供应商表的 SupplierID 的引用。在 SQL 中,它被称为“外键”。理论上,您可以使用 select 语句来创建新表,当您经常使用数据库查询时,您会根据需要选择最方便快捷的方式。

    但是当你开始学习时,最好先创建一个有结构的空表,然后使用新字段和现有数据作为外键插入数据。

    因此,查询将类似于:

    CREATE TABLE Contracts ( 
        ContractID INT NOT NULL,
        SupplierID INT NOT NULL,
        ContractValue INT,
        ContractStart DATE
    );
    

    然后您可以使用供应商表中的现有值插入数据:

    INSERT INTO Contracts (SupplierID)
    SELECT SupplierID FROM Suppliers
    

    当然这是非常简化的描述

    首先,您必须指定 ContractID 作为主键。那么上面的查询只有在您将主键指定为自动增量值时才有效,否则您必须使用一些逻辑并明确指定它。

    此外,如果要使用 NOT NULL 字段,则必须指定默认值。

    您还可以将 SupplierID 指定为外键,这样只会添加现有值并支持其他一些完整性关系。

    有关详细信息,请参阅任何 MySQL 或 SQL 文档。

    【讨论】:

    • Aloha,感谢您的cmets,但是插入数据代码有错误“错误1:由于约束失败而无法执行语句(19 NOT NULL约束失败:Contracts.ContractID )"
    • 正确,因为 ContractID id 不是 NULL,您可以通过在 CREATE TABLE 语句中的 ContractID 之后删除 NOT NULL 来简单地修复错误但是这在 SQL 中不是一个好方法。您需要做的是将字段指定为主键和自动递增值。您还可以在 INSERT 语句下指定一些虚拟值。这取决于您的业务逻辑,您必须了解自己在做什么。因此,您需要阅读文档并选择更适合您的。
    【解决方案2】:

    不知道下面的方法能否解决你的问题

    1. 复制Suppliers
    2. 从复制的表中删除不必要的列
    3. 添加您想要的新列。

    【讨论】:

      【解决方案3】:

      您可以使用CTAS 命令。

      CREATE TABLE Contracts as
      SELECT 
      0 as ContractID,
      SupplierID,
      0 as ContractValue, 
      now() as ContractStart
      FROM Suppliers;
      

      这将创建一个包含所有字段的表。默认值是指定dataType。您可以使用相关值更新表或在 select 子句本身中添加 join

      【讨论】:

        【解决方案4】:

        从另一个表创建一个表的基本语法如下

        创建表 NEW_TABLE_NAME AS 选择 [ 列 1,列 2 ...列 N ] FROM EXISTING_TABLE_NAME [地点]

        这里,column1,column2... 是现有表的字段,同样将用于创建新表的字段。

        示例 以下是一个示例,它将使用 CUSTOMERS 表创建一个表 SALARY,并具有字段 customer ID 和 customer SALARY -

        SQL> 创建表工资为 选择身份证,工资 来自客户;

        【讨论】:

          【解决方案5】:

          上周我做了,正如你想做的那样。 我只遵循了两个步骤:

          1. 导出现有表。
          2. 在 notepad++ 中打开并更改现有表名,添加我的新列并导入。

          谢谢

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-21
            • 2022-07-15
            • 2013-05-11
            • 2012-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-27
            相关资源
            最近更新 更多