Трата состоит из трех этапов. Чтение баланса пользователя, проверка хватает ли средств и собственно запись нового баланса.
баланс юзера расчитывается на лету и не хранится в юзере. Расчитывсется на основе истории его пополнений/расходов.
Если в многопоточном приложении произойдет так что два потока прочитают баланс, проверят хватает ли средств на покупку и этот этап пройдет успешно для обоих, то далее последуют две записи, которые загонят юзера в минус. Какие есть варианты защиты от двойной траты?
SELECT DISTINCT (regexp_split_to_array(commend, E'\\s+'))[:3] AS first_3_words
FROM orders
ORDER BY first_3_words[2];
В голове идея создать varchar ячейку и в неё через запятую всё записывать.
CREATE TABLE words (
word_id INT AUTO_INCREMENT PRIMARY KEY,
word VARCHAR(255) UNIQUE NOT NULL
);
CREATE TABLE phrase (
phrase_id INT NOT NULL,
FOREIGN KEY (phrase_id) REFERENCES phrases (phrase_id),
word_id INT NOT NULL,
FOREIGN KEY (word_id) REFERENCES words (word_id),
word_position INT,
PRIMARY KEY (phrase_id, word_position)
);
SELECT string_agg(concat(substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil(random() * 26)::integer, 1),
substring('abcdefghijklmnopqrstuvwxyz', ceil(random() * 26)::integer, 1),
substring('0123456789', ceil(random() * 10)::integer, 1),
substring('!#$%&()*+,-./:;<=>?@[]^', ceil(random() * 23)::integer, 1)
),
'' ORDER BY RANDOM()
)
FROM generate_series(1,8);
SELECT [DISTINCT] t.*
FROM t
JOIN t_intervals ti ON t.sequence BETWEEN ti.start AND ti.end
WHERE ti.id in (2,10,30, ..., n)
WITH
some_data AS ( SELECT ARRAY(1,2,3) AS some_value )
SELECT *
FROM some_table
CROSS JOIN some_data
WHERE some_table.some_field NOT IN some_data.some_value
Можно ли создать партишен ... куда бы попадали данные только за последние 365 дней
В документации показаны примеры. Когда создается базовая таблица table_base и дальше от нее создаются партишеныНе лезьте в высокие материи, не зная основ. Начните с самого обычного RANGE PARTITIONING. Одна таблица - куча разделов, и никаких надтаблиц.
@echo off
cls
SET /P psqlpassword="Введите пароль (Enter для завершения): "
if "%psqlpassword%"=="" exit /b
"C:\Program Files\PostgreSQL\13\bin\psql.exe" -U postgres -W %psqlpassword% -f D:/script.sql -a
pause
@echo off
:execute_psql
cls
SET /P psqlpassword="Введите пароль (Enter для завершения): "
if "%psqlpassword%"=="" exit /b
"C:\Program Files\PostgreSQL\13\bin\psql.exe" -U postgres -W %psqlpassword% -f D:/script.sql -a
if errorlevel 1 goto :execute_psql
pause