MySQL datetime列WHERE col IS NULL失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL datetime列WHERE col IS NULL失败相关的知识,希望对你有一定的参考价值。

我无法让我的基本SQL查询工作,因为它返回0值,尽管有明显的空值

询问

SELECT
  *
FROM
  leads AS l
  JOIN closes c ON l.id = c.lead_id
 WHERE
  c.close_date IS NULL

DDL

CREATE TABLE closes
(
  id               INT AUTO_INCREMENT
    PRIMARY KEY,
  lead_id          INT          NOT NULL,
  close_date       DATETIME     NULL,
  close_type       VARCHAR(255) NULL,
  primary_agent    VARCHAR(255) NULL,
  price            FLOAT        NULL,
  gross_commission FLOAT        NULL,
  company_dollar   FLOAT        NULL,
  address          VARCHAR(255) NULL,
  city             VARCHAR(255) NULL,
  state            VARCHAR(10)  NULL,
  zip              VARCHAR(10)  NULL,
  CONSTRAINT closes_ibfk_1
  FOREIGN KEY (lead_id) REFERENCES leads (id)
)
  ENGINE = InnoDB;

CREATE INDEX lead_id
  ON closes (lead_id); 

我应该提一下,我使用python web scraper和SQLAlchemy插入数据。如果数据没有被刮除,那么插入时将是None

这是datagrip的屏幕截图,显示行中的空值

enter image description here

编辑

好吧所以我继续在表格中的一些条目上运行以下内容,其中值已经是<null>

UPDATE closes
  SET close_date = NULL
WHERE
  lead_id = <INTEGERVAL>
; 

现在有趣的是,在运行原始查询时,我确实返回了我运行更新查询的2条记录(预期结果)。这将使我相信问题与我的SQLAlchemy模型如何映射插入值有关。

models.朋友

class Close(db.Model, ItemMixin):
    __tablename__ = 'closes'

    id = db.Column(db.Integer, primary_key=True)
    lead_id = db.Column(db.Integer, db.ForeignKey('leads.id'), nullable=False)
    close_date = db.Column(db.DateTime)
    close_type = db.Column(db.String(255))
    primary_agent = db.Column(db.String(255))
    price = db.Column(db.Float)
    gross_commission = db.Column(db.Float)
    company_dollar = db.Column(db.Float)
    address = db.Column(db.String(255))
    city = db.Column(db.String(255))
    state = db.Column(db.String(10))
    zip = db.Column(db.String(10))

    def __init__(self, item):
        self.build_from_item(item)

    def build_from_item(self, item):
        for k, v in item.items():
            setattr(self, k, v) 

但我相信,如果没有从网站上删除任何价值,价值就是蟒蛇None。我的理解是SQLAlchemy会在插入时将None映射到NULL并且假设nullable=True是默认设置,可以在生成的DDL上看到,我仍然不知道为什么它看起来像NULL实际上它不是表现那样。

编辑2

只有我认为问题会发生的地方才是我的蜘蛛实际抓取数据并将其分配给Item,如下所示

closes.py

# item['close_date'] = None at this point
try:
    item['close_date'] = arrow.get(item['close_date'], 'MMM D, YYYY').format('YYYY-MM-DD')
except ParserError as e:
    # Maybe item['close_date'] = None here?
    spider.logger.error(f'Parse error: {item["close_date"]} - {e}')

在我写的python代码中,这似乎是问题出现的地方。但如果arrow.get抛出一个例外,item['close_date']的价值应该仍然是None。如果不是这种情况,即使它不能解释为什么看起来记录值是NULL甚至认为它不像它那样。

答案

我猜你的连接有问题,而不是NULL值。以下查询为我返回1个结果。有关您的数据,用于查询的软件(我使用SQL Yog测试过)以及适用版本的更多信息可能有所帮助。

编辑

可能是你遇到了mysql'零日期'的问题。 qazxsw poi

MySQL允许您将“0000-00-00”的“零”值存储为“虚拟日期”。这在某些情况下比使用NULL值更方便,并且使用更少的数据和索引空间。要禁止'0000-00-00',请启用NO_ZERO_DATE模式。

我已经更新了下面的SQL数据,在INSERT和SELECT的WHERE中包含一个零日期。

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-types.html

以上是关于MySQL datetime列WHERE col IS NULL失败的主要内容,如果未能解决你的问题,请参考以下文章

MySQL组合索引和最左匹配原则

MYSQL INDEX FOR多个列组合?

在sql server 2008中如何查询本日、本周和本月数据

更新 WHERE IN() mysql

MySQL SELECT WHERE datetime 匹配时间(不一定是天)

Linq - 如何在 where 子句中使用 2 列