Обновить
В соответствии с принятым (и правильным) ответом я прокомментировал в 2011 году:
Нижняя строка: мы не создавали контейнеры для хранения
blockquote>const T
. Хотя я и подумал. И мы пришли очень близко к тому, чтобы сделать это случайно. Насколько мне известно, текущая точка привязки - это пара перегруженных функцийaddress
-члена в распределителе по умолчанию: КогдаT
-const
, эти две перегрузки имеют одну и ту же подпись. Легкий способ исправить это было бы специализациейstd::allocator
и удалением одной из перегрузок.С предстоящим проектом C ++ 17 мне кажется, что мы теперь легализованы
vector
, и я также считаю, что мы это сделали случайно . : -)P0174R0 удаляет
address
перегрузки сstd::allocator
. P0174R0 не упоминает о поддержкеstd::allocator
как части его обоснования.Коррекция
В комментариях ниже T.C. правильно отмечает, что перегрузки
address
являются устаревшими , а не удалены. Виноват. Устаревшие члены не отображаются в 20.10.9, гдеstd::allocator
определен, но вместо этого отнесены к разделу D.9. Я забыл просканировать главу D для этой возможности, когда я разместил это.Спасибо T.C. для исправления. Я предполагал удалить этот вводящий в заблуждение ответ, но, возможно, лучше оставить его с этой коррекцией, чтобы, возможно, это оставило бы кого-то еще от неправильного считывания спецификации так же, как и я.
Я считаю, что ваша проблема может заключаться в том, что number_won_games и number_all_games являются целыми числами и, следовательно, деление всегда будет 0 и, следовательно, 0, умноженное на 100, будет равно 0, возможно, создается впечатление, что ничего не обновлено.
Вы можете попробовать выполнить casting number_won_games и number_all_games в REAL, например используя: -
UPDATE Table
SET success = (CAST(number_won_games AS REAL) / CAST(number_all_games AS REAL)) * 100
WHERE name_game = 'some name';
Учитывая следующее: -
DROP TABLE IF EXISTS t;
CREATE TABLE IF NOT EXISTS t (name_game TEXT, number_won_games INTEGER, number_all_games INTEGER, success REAL);
INSERT INTO t VALUES
('game1',10,20,0.12345678);
UPDATE t SET success = (number_won_games / number_all_games) * 100;
SELECT * FROM t;
UPDATE t SET success = (CAST(number_won_games AS REAL) / CAST(number_all_games AS REAL)) * 100;
SELECT * FROM t;
Что вставляет строку с 20 играми, играемыми с 10 вон (таким образом, 50 как показатель успеха) и с успехом, установленным на ненулевое значение (чтобы показать, что первый обновление обновляется), затем
Первое UPDATE в соответствии с вашим примером приводит к: -
Пока второе UPDATE, которое выводит значения в РЕАЛЬНЫЕ результаты в: -
Я чувствую, что триггер - ваш лучший выбор здесь. У меня нет доступа к базе данных на данный момент, но что-то вроде этого, вероятно, сработает.
CREATE TABLE counter(id INTEGER PRIMARY KEY AUTOINCREMENT, success REAL, number_won_games REAL, number_all_games REAL);
CREATE TRIGGER counter_update_success AFTER UPDATE ON counter
BEGIN
UPDATE counter set NEW.success=((NEW.number_won_games/NEW.number_all_games)*100.0);
END;
CREATE TRIGGER counter_create_success AFTER INSERT ON counter
BEGIN
UPDATE counter set NEW.success=((NEW.number_won_games/NEW.number_all_games)*100.0);
END;