MySQL插入防止双

时间:2018-10-16 19:25:49

标签: php mysql sql duplicates

我正在寻找一种插入不存在的行的方法。我已经阅读了有关唯一键的信息,我还添加了一个id(唯一汽车公司)列。而且我尝试了许多不同的方法-但我无法使其正常工作。

到目前为止我尝试过的事情:

INSERT INTO programmes (station_id, programme_start, programme_end, title, subtitle, long_description, short_description, rating, imdb, episode, season, year, categories, icon, actors, writers, directors)
VALUES
  (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
  station_id = VALUES(station_id),
  programme_start = VALUES(programme_start)

我也尝试过:

ON DUPLICATE KEY UPDATE

但是我不断收到#1064错误,说“”有问题

我不知道我在做什么错..我每天都在使用数据库更新电视指南信息-我从不同的api获取这些数据。现在,这些api响应有时会含糊不清(如果某个程序跨越2天)。

我也尝试使用if and else,但我尝试的所有操作均失败,并显示错误#1064

当我尝试此查询时:

INSERT INTO `programmes` (`station_id`, `programme_start`, `programme_end`, `title`, `subtitle`, `long_description`, `short_description`, `rating`, `imdb`, `episode`, `season`, `year`, `categories`, `icon`, `actors`, `writers`, `directors`)
    VALUES (1, '2018-10-16 00:00:00', '2018-10-16 00:20:00', 'NOS Journaal', '', 'Met het laatste nieuws, gebeurtenissen van nationaal en internationaal belang en de weersverwachting voor vandaag.', 'Met het laatste nieuws, gebeurtenissen van nationaal en internationaal belang en de weersverwachting voor vandaag.', '', '', '0', '0', '2017', 'Nieuws,', 'https://wp18-images-nl-dynamic.horizon.tv/EventImages/36652793.l.3dc8d9a6db753ad283c5909e6b29a7e61fb51d51.jpg', '', '', '')
    ON DUPLICATE KEY UPDATE title = 'Test UPDATE'

它说是插入的,但是这一行已经存在,因此应该更新它,而不是插入新的行。

我的数据库包含几个表: -提供者(包含所有电视指南/电视提供者) -电台(所有电视台)该电台的ID链接到节目表,因此我可以找到该电台的所有节目。 -程序(包含所有电台的所有程序)。

我的程序表由以下查询组成:

CREATE TABLE programmes (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    station_id INT NOT NULL,
    programme_start DATETIME NOT NULL,
    programme_end DATETIME NOT NULL,
    title TEXT NOT NULL,
    subtitle TEXT NOT NULL,
    long_description TEXT NOT NULL,
    short_description TEXT NOT NULL,
    rating VARCHAR(255) NOT NULL,
    imdb VARCHAR(255) NOT NULL,
    episode INT NOT NULL,
    season INT NOT NULL,
    year VARCHAR(255) NOT NULL,
    categories TEXT NOT NULL,
    icon TEXT NOT NULL,
    actors TEXT NOT NULL,
    writers TEXT NOT NULL,
    directors TEXT NOT NULL
    );

providers表和stations表使用唯一ID作为参考。这样,我可以找到提供程序id = 1或id = 2的所有站点,并且可以这样获取站id = 1或id = 2等的所有程序。

1 个答案:

答案 0 :(得分:0)

尝试更改表键

您可以将所有应该唯一的列设置为键。

例如电视节目T,第S季,第E集,在Y年开始于Z,在K结束,在station_id I上

这可能是关键:import pyodbc # Connect to database conn_str = ( r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=C:\Temp\TestDB.accdb;' r'Uid=;' r'Pwd=;' ) # Make cursor connection = pyodbc.connect(conn_str) connection.setencoding('utf-8') cursor = connection.cursor() # Create test table cursor.execute("CREATE TABLE Coordinates (ID integer, X integer, Y integer)") connection.commit() # Create test data (Error "Missing semicolon (;)" if multiple values in one insert, thats why multiple insertions... not the main question) cursor.execute("INSERT INTO Coordinates (ID, X, Y) VALUES (1,10,10);") cursor.execute("INSERT INTO Coordinates (ID, X, Y) VALUES (2,20,10);") cursor.execute("INSERT INTO Coordinates (ID, X, Y) VALUES (3,30,10);") connection.commit() # Filter parameters Line = 10 Start = 10 End = 30 # Works cursor.execute(r""" SELECT * FROM Coordinates WHERE Y = ? AND X BETWEEN ? AND ? """, Line, Start, End ) rows = cursor.fetchall() for row in rows: print(row) # does not work - main question PrimaryAxis = 'X' SecondaryAxis = 'Y' cursor.execute(r""" SELECT * FROM Coordinates WHERE ? = ? AND ? BETWEEN ? AND ? """, SecondaryAxis, Line, PrimaryAxis, Start, End ) rows = cursor.fetchall() for row in rows: print(row)

我认为此键在逻辑上也更有意义。