唯一索引可用于确保特定值或值集最多有 1 个实例。我的问题是,有没有办法强制一个值或一组值最多有 2 个实例?我知道检查约束中的触发器和标量 UDF。我对这些解决方案不感兴趣。
数据库:SQL Server 2017。
唯一索引可用于确保特定值或值集最多有 1 个实例。我的问题是,有没有办法强制一个值或一组值最多有 2 个实例?我知道检查约束中的触发器和标量 UDF。我对这些解决方案不感兴趣。
数据库:SQL Server 2017。
这个和postgresql的statement_timeout类似。
如果花费的时间超过 x 秒,我希望出现查询错误。
我知道 SET MAX_EXECUTION_TIME,但这仅影响选择查询,而不影响更新/插入查询。
我正在更改开源预订系统以满足雇主的需求。我希望做到这一点,以便编辑或删除服务不一定会修改或删除现有约会引用的服务(例如,编辑服务的价格会留下与更改之前进行的约会列出的相同价格) 。
我目前已经实现了它,存储服务的表使用 MariaDB 的系统版本控制进行版本控制,并且约会存储row_start
服务记录的记录以在稍后创建约会时获取它。约会当前使用服务 id 作为外键,我想将其更改为使用 id 和列的密钥对,row_end
以便约会引用在进行约会或上次编辑约会时存在的服务row_end
。这样,我可以删除或编辑服务表的“当前”版本中的服务记录,而不会影响该服务的现有预约。
基本上我有:
CREATE TABLE `services` (
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(256) DEFAULT NULL,
`duration` int(11) DEFAULT NULL,
`description` text DEFAULT NULL,
`price` decimal(10,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci WITH SYSTEM VERSIONING;
INSERT INTO `services` VALUES
(1, 'Service', 30, 'This is a description', 20.00);
CREATE TABLE `appointments` (
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`start_datetime` datetime DEFAULT NULL,
`end_datetime` datetime DEFAULT NULL,
`id_services` int(11) DEFAULT NULL,
`service_timestamp` timestamp(6) NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
INSERT INTO `appointments` VALUES
(1, '2024-03-19 11:30:00', '2024-03-19 12:00:00', 1, '2038-01-18 21:14:07.999999');
ALTER TABLE appointments
ADD CONSTRAINT `appointments_services`
FOREIGN KEY (`id_services`, `service_timestamp`)
REFERENCES services(`id`, `row_end`)
ON DELETE CASCADE ON UPDATE CASCADE;
我想要的结果是:
UPDATE `services` SET `price`=30.00 WHERE `id` = 1
在约会中:
table : appointments
+-------+---------------------+---------------------+-------------+----------------------------+
| id | start_datetime | end_datetime | id_services | service_timestamp |
+-------+---------------------+---------------------+-------------+----------------------------+
| 1 | 2024-03-19 11:30:00 | 2024-03-19 12:00:00 | 1 | (When the update happened) |
+-------+---------------------+---------------------+-------------+----------------------------+
相反,我得到:
table : appointments
+-------+---------------------+---------------------+-------------+----------------------------+
| id | start_datetime | end_datetime | id_services | service_timestamp |
+-------+---------------------+---------------------+-------------+----------------------------+
| 1 | 2024-03-19 11:30:00 | 2024-03-19 12:00:00 | 1 | 2038-01-18 21:14:07.999999 |
+-------+---------------------+---------------------+-------------+----------------------------+
并尝试在更新破坏外键约束之前将 service_timestamp 更新为服务版本的 row_end 。
我想继续使用 MariaDB 的系统版本控制,因为我认为它远远超过了我自己创建的任何东西,但如果有另一种方法可以记录服务的更改并检索它们的某些版本,我愿意接受建议。
有没有一种方法可以创建一个外键约束来引用整个系统版本控制表而不仅仅是其当前版本,这样当更新或删除服务记录时,外键将引用更新或删除之前的记录?我对数据库不是很有经验,所以欢迎任何建议。
我正在尝试使用CREATE TABLE
表生成基于 SQL-SERVER 数据库中给定表的语句INFORMATION_SCHEMA
,但是当我尝试连接DEFAULT
字段声明的部分时,我的代码现在仅显示带有 的字段DEFAULT
,尽管它是像这样连接的到目前为止,字段声明的其他部分。
考虑这个表:
CREATE TABLE FOO (
ID int PRIMARY KEY NOT NULL,
BAR NVARCHAR(50) NULL,
CREATED_DATE DATETIME DEFAULT (GETDATE())
);
下面的代码生成语句,但不考虑默认值,并且还假设您只有一个主键并且没有外键。如果您添加注释掉的行,它会突然只包含一个具有默认值的字段,我无法弄清楚为什么会发生这种情况。
DECLARE @TableName NVARCHAR(128) = 'FOO';
DECLARE @sql NVARCHAR(MAX) = 'CREATE TABLE ' + @TableName + ' (' + CHAR(13);
DECLARE @primaryKey NVARCHAR(128) = '';
-- Find primary key
SELECT @primaryKey = COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND CONSTRAINT_NAME LIKE 'PK%';
-- build the string
SELECT @sql = @sql + ' [' + COLUMN_NAME + '] ' +
DATA_TYPE +
CASE
WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
WHEN DATA_TYPE IN ('decimal', 'numeric') THEN '(' + CAST(NUMERIC_PRECISION AS VARCHAR) + ', ' + CAST(NUMERIC_SCALE AS VARCHAR) + ')'
ELSE ''
END +
CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE ' NULL' END +
CASE WHEN COLUMN_NAME = @primaryKey THEN ' PRIMARY KEY' ELSE '' END +
-- Uncomment below for weird behavior:
--CASE WHEN COLUMN_DEFAULT IS NOT NULL THEN ' DEFAULT ' + UPPER(COLUMN_DEFAULT) ELSE '' END +
',' + CHAR(13)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
ORDER BY ORDINAL_POSITION;
-- clean up ending
SET @sql = LEFT(@sql, LEN(@sql) - 2) + CHAR(13) + ');';
PRINT @sql;
这是注释掉该行的输出(因此任何DEFAULT
s 都被省略):
CREATE TABLE FOO (
[ID] int NOT NULL PRIMARY KEY,
[BAR] nvarchar(50) NULL,
[CREATED_DATE] datetime NULL
);
然后使用以下行:
CREATE TABLE FOO (
[CREATED_DATE] datetime NULL DEFAULT (GETDATE())
);
为什么我的代码会生成如此不同的响应?
我有一个具有分层表示的表,为了对树结构进行建模,使用了路径枚举。尽管查询计划有待优化并且查询本身很简单,但查询执行需要 4 秒。但是,当我删除排序时,查询速度很快,但我需要这种排序。
基本上,查询应该返回其孩子满足特定条件的相关顶级父母。
以下是查询和查询计划的链接:https://www.brentozar.com/pastetheplan/ ?id=S1njIuPRT
SELECT TOP 50 Id
FROM Site root
WHERE Archive = 288
AND TypeId IN( 1 )
AND EXISTS (SELECT 1
FROM Site ch
WHERE ch.[path] LIKE concat(root.Path, '%')
AND ch.Commercial = 0
AND ch.Archive = 288)
ORDER BY root.Score DESC
users
我有一个带有和 列 的表username
。我正在尝试在该列上构建索引users#username
,但它失败并出现重复值错误。检测到的值是阿拉伯字符集值。请注意,当我这样做时
select count(*), username from users group by username having count(*)>=2;
它返回0
。
数据库的排序规则是en_us.UTF8
。
为什么group by
无法检测到重复项,而构建的唯一索引却发现了重复项却失败了?
所以这个让我难住了。我们正在进行一些权限清理,并且希望从数据库角色中删除一些 AD 组。
我们跑ALTER ROLE MyRole DROP MEMBER [domain\group]
并得到Commands completed successfully.
。
但
该组仍然是该角色的成员。
有任何想法吗?运行命令的登录名是实例上的系统管理员。我们也尝试过旧的exec sp_droprolemember
,结果相同。
我想知道是否按mysqldump
以下方式执行
mysqldump --all-databases --master-data > dump.sql
整个过程中所有表都被锁定,还是只是逐个表锁定?换句话说,是否会mysqldump
中断(暂停)进程期间的所有写入查询,或者仅中断(暂停)那些试图修改当前正在导出的表的查询?这些查询是否被中断或暂停?
我有一个大型数据库,持续为客户使用的应用程序提供服务。它大约有 50GB,需要几个小时才能转储完成。我无法停止数据库,需要转储它而不影响其工作能力。我计划使用该转储在主从策略下将数据库复制到另一台服务器上。仅供参考,二进制日志已打开并server_id
已设置。
+-------------------------------+
| version() |
+-------------------------------+
| 5.6.14-1+debphp.org~precise+1 |
+-------------------------------+
如何在Flutter中创建唯一的id以添加到firebase中的数据库中?