【问题标题】:load data infile with select query for data lookup使用选择查询加载数据文件以进行数据查找
【发布时间】:2013-10-14 18:00:43
【问题描述】:

我能够使用以下创建和加载数据文件命令成功加载文件:

--Create and load addresses
CREATE TABLE `addresses` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `address1` varchar(100) NOT NULL,
  `address2` varchar(100) DEFAULT NULL,
  `city` varchar(100) NOT NULL,
  `stateCode` varchar(2) NOT NULL,
  `zipCode` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8;

LOAD DATA INFILE 'C:/temp/address.dat'    
    INTO TABLE mbc.addresses
    FIELDS
        TERMINATED BY X'1F'
    LINES
        TERMINATED BY X'1E'
    (name,address1,address2,city,stateCode,zipCode);

现在,我想使用加载到地址中的地址 ID 将另一个文件 (receipt.dat) 中的数据加载到收据表中。目前,地址名称存储在receipt.dat 中的“addressId”字段中。我想做这样的事情,但不确定正确的语法是什么:

--Create and load receipts
CREATE TABLE `receipts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `receiptDate` date NOT NULL,
  `addressId` bigint(20) NOT NULL,
  `amount` decimal(10,0) NOT NULL,
  `notes` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `addressFK_idx` (`addressId`),
  CONSTRAINT `addressFK` FOREIGN KEY (`addressId`) REFERENCES `addresses` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOAD DATA INFILE 'C:/temp/receipt.dat'    
    INTO TABLE mbc.receipts
    FIELDS
        TERMINATED BY X'1F'
    LINES
        TERMINATED BY X'1E'
    (receiptDate, 
    select max(addressId) from mbc.addresses where name = @addressId,  
    amount, 
    notes);

格式化上面的select max(addressId... 行的正确方法是什么(如果有的话)?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    可以设置addresId:

    --Create and load receipts
    CREATE TABLE `receipts` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `receiptDate` date NOT NULL,
      `addressId` bigint(20) NOT NULL,
      `amount` decimal(10,0) NOT NULL,
      `notes` varchar(200) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `addressFK_idx` (`addressId`),
      CONSTRAINT `addressFK` FOREIGN KEY (`addressId`) REFERENCES `addresses` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    LOAD DATA INFILE 'C:/temp/receipt.dat'    
        INTO TABLE mbc.receipts
        FIELDS
            TERMINATED BY X'1F'
        LINES
            TERMINATED BY X'1E'
        (receiptDate, amount, notes)
        SET addressId = select max(addressId) from mbc.addresses where name = @addressId;
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      这最终为我工作......希望这对其他人有所帮助

      --Create and load receipts (uses data from the table create/load scripts above)
      CREATE TABLE `receipts` (
        `id` bigint(20) NOT NULL AUTO_INCREMENT,
        `receiptDate` date NOT NULL,
        `addressId` bigint(20) NOT NULL,
        `designationId` bigint(20) NOT NULL,
        `amount` decimal(10,0) NOT NULL,
        `notes` varchar(1000) DEFAULT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      
      LOAD DATA INFILE 'C:/temp/receipt.dat'    
          INTO TABLE mbc.receipts
          FIELDS
              TERMINATED BY X'1F'
          LINES
              TERMINATED BY X'1E'
          (@var1,@var2,@var3,amount,notes)
          SET receiptDate = STR_TO_DATE(@var1,'%m/%d/%Y'),
          addressId = (select max(id) from addresses where name = @var2),
          designationId = (select max(id) from designations where name = @var3);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        相关资源
        最近更新 更多