Запретить вставлять дубликаты в таблицу (python , sql)

#python #sql #mariadb

Вопрос:

Я преодолел проблему при внедрении базы данных в свой проект на Python.

Я создаю новую таблицу со следующим кодом:

     mycursor = mydb.cursor()
    sql = f"CREATE TABLE IF NOT EXISTS _{self.client_id} (tour_date DATE, tour_distance INT, tour_duration INT, tour_elevation_up INT, tour_elevation_down INT, tour_map_image TEXT, tour_name TEXT, tour_sport TEXT, tour_start_point TEXT, tour_type TEXT)"
    mycursor.execute(sql)
    mydb.commit()
 

Я перебираю свои данные и хочу вставить их в таблицу. Но я не хочу, чтобы, если запись уже существует в таблице, она снова добавляла те же данные.

Это мой код, который я в настоящее время должен вставить в свою таблицу:

       mycursor = mydb.cursor()
      sql = f"INSERT INTO _{self.client_id} (tour_date, tour_distance, tour_duration, tour_elevation_up, tour_elevation_down, tour_map_image, tour_name, tour_sport, tour_start_point, tour_type) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) "
      val = (TourDate, TourDistance, TourDuration, TourElevation_up, TourElevation_down, TourMap_image, TourName, TourSport, TourStart_point, TourType)
      mycursor.execute(sql, val)
      mydb.commit()
 

Поэтому мой вопрос в том, как я могу проверить, существует ли запись уже в таблице, а затем избежать создания дубликата?

Комментарии:

1. Какой тип SQL используется? SQLite?

2. Какое уникальное поле в таблице? (имя тура? tour_date?)

3. Я использую MariaDB (если это то, что вы хотите знать). Имя тура уникально

4. Ознакомьтесь с документацией: mariadb.com/kb/en/create-table/#unique-key-column-option

5. Это сработало для меня 😀

Ответ №1:

вы можете «выбрать count() из вашего имя_таблицы, где client_id=’current_id’, если count() возвращает значение int, большее 0, вы не должны вставлять его в базу данных.

Комментарии:

1. Но я хочу проверить, совпадает ли запись в существующей таблице, а не существует ли таблица. У меня есть для каждого пользователя новая таблица, и я считаю, что таблицы-это данные.

Ответ №2:

  • Во — первых-избегайте использования TEXT без необходимости
  • Второе — создайте таблицу с необходимыми индексами:
     CREATE TABLE IF NOT EXISTS _{self.client_id} (
        tour_date DATE, 
        tour_distance INT, 
        tour_duration INT, 
        tour_elevation_up INT, 
        tour_elevation_down INT, 
        tour_map_image TEXT, 
        tour_name VARCHAR(64) PRIMARY KEY, 
        tour_sport VARCHAR(64), 
        tour_start_point VARCHAR(64), 
        tour_type VARCHAR(64)
    );
 
  • INSERT IGNORE ... Оператор третьего использования для предотвращения дублирования