Замена данных в таблице для SQLite - PullRequest
0 голосов
/ 01 сентября 2018

Я рассмотрел несколько разных предложений, но по какой-то причине ни одно из следующих решений не смогло работать / все еще дублировало данные в таблице.

«Категория» будет уникальным значением для этой таблицы SQLite. Значение, которое будет изменено, - "СТЬ_Предела ".

Пока я пробовал:

public void writeToSpendingLimits(int sequence, double amount){
    String sql = "INSERT OR REPLACE INTO spending_limits(category, spending_limit) "
    + "VALUES(" + sequence + ", " +  amount + ");";           
    connection.executeSQL(sql);
}

.

public void writeToSpendingLimits(int sequence, double amount){           
        String sql = "INSERT INTO spending_limits (category, spending_limit) "
            + "VALUES(" + sequence + ", " + amount + ") "
            + "ON CONFLICT(category)"
            + "DO UPDATE SET spending_limit = " + amount + ";";
    connection.executeSQL(sql);

.

public void writeToSpendingLimits(int sequence, double amount){            
    String sql = "INSERT INTO spending_limits (category, spending_limit) "
            + "VALUES (coalesce((select category from spending_limits where category = " + amount + "),"
            + "(select max(category) from spending_limits) + 1), " + amount + ");";
    connection.executeSQL(sql);

.

public void writeToSpendingLimits(int sequence, double amount){              
    String sql = "UPDATE spending_limits " 
            + "SET category = " + sequence + ", " + "spending_limit = " + amount + " "
            + "WHERE spending_limit = " + sequence + ";\n"
            + "INSERT INTO spending_limits(category, spending_limit) "
            + "SELECT " + sequence + ", " + amount + " "
            + "WHERE (Select Changes() = 0)";
    connection.executeSQL(sql);

1 Ответ

0 голосов
/ 02 сентября 2018

Предполагая, что вы хотите установить единый лимит расходов на категорию, вы можете сделать категорию столбцом УНИКАЛЬНЫЙ . Тогда дублированная категория приведет к конфликту, и будут предприняты действия конфликта, такие как OR REPLACE.

например. Учтите следующее: -

DROP TABLE IF EXISTS spending_limits;
CREATE TABLE IF NOT EXISTS spending_limits (category INTEGER UNIQUE NOT NULL, spending_limit REAL);
INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES(1,10.23);
INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES(2,10.23);
INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES(3,10.23);
INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES(4,10.23);
INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES(5,10.23);
INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES('Animal',10.23);
INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES('Vegetable',10.23);
INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES('Mineral',10.23);
SELECT *,rowid AS rid FROM spending_limits;

INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES(1,11.23);

INSERT OR REPLACE INTO spending_limits (category, spending_limit) VALUES('Animal',11.23);

SELECT *,rowid AS rid FROM spending_limits;

Это будет: -

  • УДАЛИТЬ таблицу расходов_лимитов , если она существует (упрощает тестирование)
  • СОЗДАЙТЕ таблицу расходы_лимитов , отмечая, что столбец категории имеет атрибут UNIQUE .
  • ВСТАВИТЬ 8 строк в таблицу расходов_лимитов (смешанные типы категорий для демонстрационных целей)
  • ВЫБРАТЬ все строки и выводить их
  • ВСТАВИТЬ 2 повторяющихся строки, в соответствии с категорией, но с установленным количеством.
    • т.е. инструкция вставляет новую строку или заменяет существующую строку в зависимости от того, существовала ли категория.
  • ВЫБЕРИТЕ все строки и выведите их.

Результаты: -

После первоначальной вставки 8 строк: -

enter image description here

После вставки (замены) двух строк, которые имеют существующие категории: -

enter image description here

  • Примечание Также обновляется столбец rowid (поэтому он может быть кандидатом на то, чтобы быть таблицей БЕЗ ROWID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...