Floor报错原理详解+sql唯一约束性

目录

floor报错原理

唯一性约束

主键约束:

创建约束的形式

删除约束

删除唯一性约束(UNIQUE Constraint)

在SQL Server中:

在MySQL中:

在PostgreSQL中:

删除主键约束:


floor报错原理

floor报错能使用的根本前提:该表定义了唯一性约束(下述会深入了解唯一性约束)

主要原因主键冲突

原因分析:floor(rand(0)*2)会生成多个结果 as 为 a, a 又被group by 当做分组的基准,当查询附加count(*),是因为尽管在这个场景下不是用来计算记录数量,但它是SQL查询的一部分,且由于group by的作用,会创建临时表并尝试基于不合法的分组条件来计数,进而引发数据库内部错误。同时在没有明确指定的列上进行分组时,数据库系统在内部创建临时表并尝试插入分组的结果,而基于floor (rand(0)*2)的分组可能导致多个记录落入相同的分组ID,从而违反了表的唯一性束缚,最终导致主键冲突.

唯一性约束

唯一性约束:在数据库管理系统中用于确保一个或一组列(字段)中的数据具有唯一性的规则。它限制了在指定列上插入重复值的行为,即在该列(或列集合)中,任何两行记录都不能有完全相同的值。

具体讲述唯一性约束:

单列唯一性约束:当一个列被定义唯一性约束时,该列中,任意两个字段的值都不能相同,NULL值也不例外;

组合列唯一性约束:单列之间的值可以相同,但是列与列之间任意一行中的值都不能相同

作用

防止数据冗余和数据的错误输入

除了主键之外提供另一种标识记录的方式,特别适用于那些不是主要标识符但是需要保证其唯一性的场景。

主键约束:

主键约束是一种特殊的唯一性约束,也是主键固有的特性,当某列在被定义为主键的同时,该列就已经有了主键约束,他不仅要求一列或者多列(考虑到联合主键)的值不能相同,而且其中不能有NULL值,一个表中只允许有一个主键,但是可以有多个唯一性约束

创建约束的形式

CREATE TABLE Users (
    UserID INT PRIMARY KEY,  -- 定义主键
    Username VARCHAR(50) NOT NULL,
    Email VARCHAR(100),
    UNIQUE (Username),   -- 单列唯一性约束
    UNIQUE (Email)       -- 单列唯一性约束
);

-- 或者针对组合列的唯一性约束
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    ProductID INT,
    UserID INT,
    Quantity INT,
    UNIQUE (ProductID, UserID)  -- 组合列唯一性约束
);

删除约束

删除表的唯一性约束和主键约束的过程类似于删除单一约束,以下是不同数据库系统中进行这些操作的一般示例:

删除唯一性约束(UNIQUE Constraint)

在SQL Server中:
-- 假设唯一性约束名为 'UQ_YourColumn'

ALTER TABLE YourTable DROP CONSTRAINT UQ_YourColumn;

如果不知道唯一性约束的具体名称,可以先查询:

SELECT name FROM sys.indexes WHERE type = 2 AND object_id = OBJECT_ID(N'YourTable');

解释:sys.indexes表中有所有数据库的索引信息,name,即为索引的名称;type=2,即为唯一性约束列的索引;OBJECT_ID(N'YourTable'),可以替换为你要查的那个表。
在MySQL中:
-- 假设唯一性约束是在列 'your_column' 上创建的

ALTER TABLE YourTable DROP INDEX your_unique_constraint_name;

-- 如果没有显式指定约束名,可能需要找到其默认生成的名称

SHOW CREATE TABLE YourTable;

-- 查看常见表时赋予给表的具体结构以确定唯一性约束的名称
在PostgreSQL中:
-- 假设唯一性约束的列名为 'your_unique_constraint'

ALTER TABLE YourTable DROP CONSTRAINT your_unique_constraint;

删除主键约束:

-- 假设我们的表名为 'YourTable',主键名为 'PK_YourTable' 或者没有显式指定名称时由系统自动生成

-- 显式命名的主键约束
ALTER TABLE YourTable
DROP CONSTRAINT PK_YourTable;

-- 如果主键约束未命名或不知道具体名称(某些数据库系统如SQL Server)
-- 可能需要先查询主键约束名,然后使用上述方式删除
-- 以下是一个示例查询主键约束名的SQL(MySQL不适用,仅适用于SQL Server或其他支持类似语法的数据库)
SELECT name 
FROM sys.key_constraints 
WHERE type = 'PK' AND parent_object_id = OBJECT_ID('YourTable');

-- sys.key_constraints,type='PK' 类比于sys.indexes,type=2,都是固定的。

-- 删除未命名主键约束(PostgreSQL示例)
ALTER TABLE YourTable
DROP CONSTRAINT IF EXISTS your_primary_key_constraint_name;

-- 在MySQL中删除主键约束(假设主键只有一列,名为 'your_primary_key_column')
ALTER TABLE YourTable
DROP PRIMARY KEY;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值