【问题标题】:INSERT SELECT * FROM ON DUPLICATE Results in Error 1136INSERT SELECT * FROM ON DUPLICATE 导致错误 1136
【发布时间】:2015-12-26 00:32:19
【问题描述】:

我正在尝试将 df 插入/更新到 mysql 表中。我收到此错误

"_mysql_exceptions.OperationalError: (1136, "Column count doesn't match value count at row 1")"

在下面代码的执行行上。有关解决方法或更好方法的任何建议?

db = MySQLdb.connect(
  host = "myhost",
  user = "username",
  passwd = "password",
  db = "mydb",
  charset='utf8'
 )

df.to_sql(con=db, name='t', if_exists='replace', flavor='mysql')

sqlStatement = """INSERT INTO db.films SELECT t.* FROM db.t
            ON DUPLICATE KEY UPDATE 
            films.releasedP=t.releasedP,
            films.runtimeP=t.runtimeP,
            films.imdbRatingP=t.imdbRatingP,
            films.votesYearP=t.votesYearP,
            films.years=t.years,
            films.votesYear=t.votesYear
            ;"""

cursor = db.cursor()
cursor.execute(sqlStatement)
db.commit()

这是我尝试插入/更新数据的表的架构。

DESCRIBE db.t;

+----------------------------+-------------+------+-----+---------+-------+
| Field                      | Type        | Null | Key | Default | Extra |
+----------------------------+-------------+------+-----+---------+-------+
| Title                      | varchar(63) | YES  |     | NULL    |       |
| imdbID                     | varchar(63) | YES  |     | NULL    |       |
| Released                   | varchar(63) | YES  |     | NULL    |       |
| Runtime                    | varchar(63) | YES  |     | NULL    |       |
| imdbRating                 | varchar(63) | YES  |     | NULL    |       |
| imdbVotes                  | varchar(63) | YES  |     | NULL    |       |
| releasedDateTime           | datetime    | YES  |     | NULL    |       |
| maxDateTime                | datetime    | YES  |     | NULL    |       |
| years                      | float       | YES  |     | NULL    |       |
| votesYear                  | float       | YES  |     | NULL    |       |
| rating                     | float       | YES  |     | NULL    |       |
| runtimeF                   | float       | YES  |     | NULL    |       |
| releasedP                  | float       | YES  |     | NULL    |       |
| runtimeP                   | float       | YES  |     | NULL    |       |
| imdbRatingP                | float       | YES  |     | NULL    |       |
| votesYearP                 | float       | YES  |     | NULL    |       |
+----------------------------+-------------+------+-----+---------+-------+

DESCRIBE db.films;

+----------------------------+-------------+------+-----+---------+-------+
| Field                      | Type        | Null | Key | Default | Extra |
+----------------------------+-------------+------+-----+---------+-------+
| Actors                     | varchar(63) | YES  |     | NULL    |       |
| Awards                     | varchar(63) | YES  |     | NULL    |       |
| Country                    | varchar(63) | YES  |     | NULL    |       |
| Director                   | varchar(63) | YES  |     | NULL    |       |
| Genre                      | varchar(63) | YES  |     | NULL    |       |
| Language                   | varchar(63) | YES  |     | NULL    |       |
| Metascore                  | varchar(63) | YES  |     | NULL    |       |
| Plot                       | varchar(63) | YES  |     | NULL    |       |
| Poster                     | varchar(63) | YES  |     | NULL    |       |
| Rated                      | varchar(63) | YES  |     | NULL    |       |
| Released                   | varchar(63) | YES  |     | NULL    |       |
| Response                   | varchar(63) | YES  |     | NULL    |       |
| Runtime                    | varchar(63) | YES  |     | NULL    |       |
| Title                      | varchar(63) | YES  |     | NULL    |       |
| Type                       | varchar(63) | YES  |     | NULL    |       |
| Writer                     | varchar(63) | YES  |     | NULL    |       |
| Year                       | varchar(63) | YES  |     | NULL    |       |
| imdbID                     | varchar(63) | YES  | UNI | NULL    |       |
| imdbRating                 | varchar(63) | YES  |     | NULL    |       |
| imdbVotes                  | varchar(63) | YES  |     | NULL    |       |
| years                      | float       | YES  |     | NULL    |       |
| votesYear                  | float       | YES  |     | NULL    |       |
| rating                     | float       | YES  |     | NULL    |       |
| runtimeF                   | float       | YES  |     | NULL    |       |
| releasedP                  | float       | YES  |     | NULL    |       |
| runtimeP                   | float       | YES  |     | NULL    |       |
| imdbRatingP                | float       | YES  |     | NULL    |       |
| votesYearP                 | float       | YES  |     | NULL    |       |
| releasedDateTime           | datetime    | YES  |     | NULL    |       |
| maxDateTime                | datetime    | YES  |     | NULL    |       |
+----------------------------+-------------+------+-----+---------+-------+

【问题讨论】:

  • db.t 的架构是什么?是两个表模式不匹配的接缝。

标签: mysql python-2.7 pandas bulkinsert on-duplicate-key


【解决方案1】:

db.filmsdb.t 表的架构不匹配。因此,您需要定义表 db.films 的哪些列将设置为表中的值 ``。

试试这个查询:

INSERT INTO db.films (
  Title,
  imdbID,
  Released,
  Runtime,
  imdbRating,
  imdbVotes,
  releasedDateTime,
  maxDateTime,
  years,
  votesYear,
  rating,
  runtimeF,
  releasedP,
  runtimeP,
  imdbRatingP,
  votesYearP
)
SELECT
  Title,
  imdbID,
  Released,
  Runtime,
  imdbRating,
  imdbVotes,
  releasedDateTime,
  maxDateTime,
  years,
  votesYear,
  rating,
  runtimeF,
  releasedP,
  runtimeP,
  imdbRatingP,
  votesYearP
FROM db.t
ON DUPLICATE KEY UPDATE 
  films.releasedP=t.releasedP,
  films.runtimeP=t.runtimeP,
  films.imdbRatingP=t.imdbRatingP,
  films.votesYearP=t.votesYearP,
  films.years=t.years,
  films.votesYear=t.votesYear

【讨论】:

  • 对不起,保罗,但这是我更新的一个错字。字段匹配。
  • 您在我写答案时更新了问题。我现在也更新了答案。
  • 谢谢,仅供参考:我只需要指定 INSERT INTO 字段,因为它仍然可以与语句的 SELECT 部分中的星号一起使用。
  • 我知道,现在可以了。但是想一想,如果您或其他人决定对表 t 的对象中的属性重新排序,将会发生什么。
猜你喜欢
  • 2022-08-02
  • 2011-01-29
  • 2015-05-16
  • 1970-01-01
  • 2012-02-26
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多