代码之家  ›  专栏  ›  技术社区  ›  Enrique

使用外键优化联接语句,并用空值显示记录

  •  2
  • Enrique  · 技术社区  · 15 年前

    我有以下结构

    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    
    CREATE TABLE IF NOT EXISTS `sis_param_tax` (
      `id` int(5) NOT NULL auto_increment,
      `description` varchar(50) NOT NULL,
      `code` varchar(5) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7;
    
    CREATE TABLE IF NOT EXISTS `sis_param_city` (
      `id` int(4) NOT NULL auto_increment,
      `name` varchar(100) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
    
    CREATE TABLE IF NOT EXISTS `sis_supplier` (
      `id` int(15) NOT NULL auto_increment,
      `name` varchar(200) NOT NULL,
      `address` varchar(200) default NULL,
      `phone` varchar(30) NOT NULL,
      `fk_city` int(11) default NULL,
      `fk_tax` int(11) default NULL,
      PRIMARY KEY  (`id`),
      KEY `fk_city` (`fk_city`),
      KEY `fk_tax` (`fk_tax`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
    
    ALTER TABLE `sis_supplier`
      ADD CONSTRAINT `sis_supplier_ibfk_4` FOREIGN KEY (`fk_tax`) REFERENCES `sis_param_tax` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
      ADD CONSTRAINT `sis_supplier_ibfk_3` FOREIGN KEY (`fk_city`) REFERENCES `sis_param_city` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;
    

    我的问题是

    1. 这个结构允许我有一个城市和税收字段为空的供应商(以防用户没有设置这些值)。对吗?

    2。 如果我删除“X”城市,供应商的FK_City with City=“X”设置为空,与FK_Tax相同。对吗?

    三。 我想优化( 如果可能的话 )下面的连接语句,以便我可以显示FK_City和/或FK_Tax=空的供应商

    SELECT DISTINCT 
      sis_supplier.id,
      sis_supplier.name,
      sis_supplier.telefono,
      sis_supplier.address,
      sis_supplier.phone,
      sis_supplier.cuit,
      sis_param_city.name AS city,
      sis_param_tax.description AS tax,
      sis_supplier.fk_city,
      sis_supplier.fk_tax
    FROM
      sis_supplier 
      LEFT OUTER JOIN sis_param_city
      ON
      sis_supplier.`fk_city` = sis_param_city.id
      LEFT OUTER JOIN `sis_param_tax`
      ON
      sis_supplier.`fk_tax` = `sis_param_tax`.`id`
    

    提前多谢了,

    2 回复  |  直到 15 年前
        1
  •  2
  •   Bill Karwin    15 年前
    1. 对。

    2. 对。

    3. 是的,优化很好。您显示的查询看起来不错。它怎么不适合你?


    你分析过这个问题吗 EXPLAIN ?这可以帮助您判断什么时候有一个查询没有有效地使用索引。事实上,所有的 Chapter 7 Optimization 建议阅读。

        2
  •  1
  •   Omu    15 年前

    如果要显示具有空值的记录,请不要使用 右连接或左连接
    取决于你的需要