有人可以澄清没有唯一约束(Oracle)的唯一索引的目的是什么?例如,
create table test22(id int, id1 int, tmp varchar(20));
create unique index idx_test22 on test22(id);
insert into test22(id, id1, tmp) values (1, 2, 'aaa'); // ok
insert into test22(id, id1, tmp) values (1, 2, 'aaa'); // fails, ORA-00001: unique
// constraint (TEST.IDX_TEST22) violated
Run Code Online (Sandbox Code Playgroud)
到目前为止看起来有一个约束.但
create table test33(id int not null primary key,
test22_id int not null,
foreign key(test22_id) references test22(id) );
Run Code Online (Sandbox Code Playgroud)
也失败了"ORA-02270: no matching unique or primary key for this column-list".我完全被这种行为搞糊涂了.有没有约束?
有很多文章解释了为什么可以在没有唯一索引的情况下获得唯一约束; 这很清楚,也很有道理.但是,我不理解没有约束的唯一索引的原因.
我对一个看似简单的概念感到困惑.Mysql将确定性函数定义为函数
始终为相同的输入参数生成相同的结果
所以在我的理解中,功能就像
CREATE FUNCTION foo (val INT) READS SQL DATA
BEGIN
DECLARE retval INT;
SET retval = (SELECT COUNT(*) FROM table_1 WHERE field_1 = val);
RETURN retval;
END;
Run Code Online (Sandbox Code Playgroud)
不确定(不保证在2次调用函数之间不会发生删除/更新/插入).同时,我看到许多函数几乎完全相同,即基于查询结果的返回值,并声明为DETERMINISTIC.看起来我错过了一些非常基本的东西.
任何人都可以澄清这个问题吗?
谢谢.
更新
感谢那些回答(+1); 到目前为止,似乎存在广泛滥用DETERMINISTIC关键字的问题.我很难相信有这么多人这样做,所以我会等待其他答案.
我需要将Oracle XMLType列映射到hibernate实体类.有一个工作(我认为众所周知)的解决方案涉及实施UserType; 但是,我无法使用它,因为需要导入Oracle xml解析器,这反过来会导致许多问题.
我可以将xml列的值作为字符串访问并将转换保留给操作实体的代码,但是我找不到从中读取值并将其写入数据库的方法.到目前为止我尝试了什么:
String.结果 - 值读为null.如果属性是公正的Serializable,我会得到"无法反序列化"的异常.@Formula注释(CAST xmlCol as varchar2(1000)).结果 - 不存储值@Loader并把CAST在SELECT.这是最有希望的尝试 - 读取并成功存储了值,但是当加载包含xml列的实体的集合时,我得到null(@Loader如果基础表被LEFT JOIN编辑,Hibernate不使用sql ).我认为应该工作的另一种方法是将xml列作为String(用于写入)加上用于读取的虚拟字段@Formula; 然而,它看起来像是一个肮脏的黑客,我宁愿不这样做,除非我别无选择.
最后,我能做的最后一件事就是更改DB Schema(更多的是1选项,比如view + triggers,列数据类型更改),但这对我来说也不是一个好选择.
我想知道我是否遗漏了某些东西或者是否有办法让(3)工作?
我需要表中的1列来保存唯一的非空值或NULL.TSQL UNIQUE约束将2 NULLs视为相等,因此我无法使列唯一.
处理这个问题的正确方法是什么?
在做了一些研究后,我发现了两种看似正确的方法,但我无法确定哪种方法更好.
第一个不适用于所有情况:
CREATE TABLE test (id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
null_or_unique_id INT, unique_key AS
(CASE WHEN [null_or_unique_id] IS NULL THEN -(1)*[id]
ELSE [null_or_unique_id] END), UNIQUE(unique_key ));
Run Code Online (Sandbox Code Playgroud)
它的工作原理但要求所有允许的值null_or_unique_id都是非负的(在我的情况下也没问题)
第二个:
CREATE VIEW test_view WITH SCHEMABINDING AS
SELECT [null_or_unique_id] FROM dbo.test WHERE [null_or_unique_id] IS NOT NULL;
GO
CREATE UNIQUE CLUSTERED INDEX byNullOrUniqueId
ON dbo.test_view([null_or_unique_id]);
Run Code Online (Sandbox Code Playgroud)
当然,也可以使用触发器实现所需的功能,但我认为触发器解决方案将产生比上面提到的任何更多的开销.
这种情况的最佳做法是什么?
谢谢你的回答.
我需要在作为会话bean实现的Java Web服务中建立数据库连接,我不确定我是否做得对.
我创建了一个类
public final class SQLUtils {
//.....
private static DataSource m_ds=null;
static
{
try
{
InitialContext ic = new InitialContext();
m_ds = (DataSource) ic.lookup(dbName); //Connection pool and jdbc resource previously created in Glassfish , dbName contains the proper JNDI resource name
}
catch (Exception e)
{
e.printStackTrace();
m_ds = null;
}
}
public static Connection getSQLConnection() throws SQLException
{
return m_ds.getConnection();
}
}
Run Code Online (Sandbox Code Playgroud)
每当我需要连接时,我都会这样做
Connection cn = null;
try
{
cn = SQLUtils.getSQLConnection();
// use connection
}
finally …Run Code Online (Sandbox Code Playgroud) 我有许多SQLServer代理预定作业,其中一个执行完整数据库备份.我希望在备份开始时禁用其他一些作业,并在备份完成后重新启用它们.这样做的正确方法是什么?我正在考虑将以下tsql命令之一添加到备份任务的第一步(以及相应的启用命令到最后一步),但我找不到哪一个更好(或者可能有另一种方式).
UPDATE MSDB.dbo.sysjobs
SET Enabled = 0
WHERE [Name] IN (....)
Run Code Online (Sandbox Code Playgroud)
还是一些EXEC dbo.sp_update_job?
谢谢.
我很好奇我是否可以依赖任何特定的验证NOT NULL, FOREIGN KEY, UNIQUE, CHECK约束和BEFORE触发器的顺序.
根据经验,我知道MySQL首先检查NOT NULL,然后启动BEFORE触发器,然后检查UNIQUE约束.Oracle NOT NULL在BEFORE触发后检查(我相信SQLServer也会这样做,但不记得).标准是否对订单有所说明,或者完全取决于数据库供应商?
Oracle是否允许我将列包含在索引中(如SQL Server INCLUDE子句CREATE INDEX)?
谢谢.
我有一个带DATE列的Mysql表,默认为'0000-00-00'.例如,如果我尝试调用,
em.find(MyTable.class,pk_value);
并且它恰好是数据库中具有默认日期值'0000-00-00'的记录,则抛出异常("java.sql.SQLException:Value ...不能表示为java.sql.Date".对于默认情况为'0000-00-00 00:00:00'的DateTime列,会发生同样的错误.
是否可以告诉EntityManager这些值是否正常?谢谢.
我有一个呈现WebGrid的部分视图.我的控制器看起来像
public ActionResult Index()
{
return View();
}
public ActionResult GetUserList(int? page, string sort, string sortdir)
{
var model = UserModel.getList(page,sort,sortdir);
return PartialView("_UserList",model);
}
Run Code Online (Sandbox Code Playgroud)
Index.cshtml:
问题是我每次点击网格导航或排序链接时都会调用方法.如何让Webgrid执行不同的操作(在本例中)?我确信我可以使用jquery在网格中添加所有链接,但我相信它应该是更好的方法.
我正在做的事情也可能是完全错误的,所以感谢您的建议.
....
@Html.Action("GetUserList")IndexGetUserListGetUserList
oracle ×3
java ×2
mysql ×2
sql ×2
sql-server ×2
glassfish ×1
hibernate ×1
java-ee ×1
jdbc ×1
jndi ×1
persistence ×1
t-sql ×1
unique-key ×1
webgrid ×1
xml ×1