是否可以制作XOR CHECK CONSTRAINT?
我是在我刚刚制作的测试表上做的,它叫做test并有3列:
我为此做了一个检查约束:
(a IS NOT NULL AND b = NULL) OR (b IS NOT NULL AND a = NULL)
Run Code Online (Sandbox Code Playgroud)
我通过这样做测试了它:
INSERT INTO public.test(
id, a, b)
VALUES (1, 1, 1);
Run Code Online (Sandbox Code Playgroud)
哪个应该失败,因为它在OR的任何一侧都没有评估为TRUE.但是,插入就好了.
当我看到postgres实际存储为约束时,我得到了这个:
(a IS NOT NULL AND b = NULL::bigint OR b IS NOT NULL AND a = NULL::bigint)
Run Code Online (Sandbox Code Playgroud)
我听说AND先于OR,所以即使这样也应该有效.
有人有解决方案吗?优选地,也可以具有三列或更多列?我知道那些可能会更复杂.
编辑:改变
= NULL
Run Code Online (Sandbox Code Playgroud)
至
IS NULL
Run Code Online (Sandbox Code Playgroud)
给我吗:
ERROR: cannot cast type boolean to bigint
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以先评估 CHECK CONSTRAINT 中的某些条件,然后对另一个表达式进行 OR 运算。
我的情况:
4 表:\
我想做一个检查约束,它基本上遵循以下逻辑:
if main.type = 0:
main.a != NULL
main.b = NULL
main.c = NULL
elif main.type = 2:
main.a = NULL
main.b = NULL
main.c != NULL
Run Code Online (Sandbox Code Playgroud)
如果 type = 1 我不在乎填写什么。
我尝试像这样做一个检查约束:
CHECK((main.type = 0 AND main.a != NULL AND main.b = NULL AND main.c = NULL) OR
(main.type = 2 AND main.a = NULL AND main.b = NULL AND main.c != NULL))
Run Code Online (Sandbox Code Playgroud)
问题是在应用此约束后,内括号会被删除/忽略,这意味着它几乎变得无意义并且不起作用。 …
我无法在任何地方找到这个exitcode,但希望你们中的一个可以帮助我或让我知道这是否是python/Django中的错误.
无论如何,首先是这里的堆栈跟踪:
Traceback (most recent call last):
File "C:\Sitezooi\SiteTest\manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Program Files\Python\lib\site-packages\django\core\management\__init_
_.py", line 385, in execute_from_command_line
utility.execute()
File "C:\Program Files\Python\lib\site-packages\django\core\management\__init_
_.py", line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Program Files\Python\lib\site-packages\django\core\management\base.py
", line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File "C:\Program Files\Python\lib\site-packages\django\core\management\base.py
", line 338, in execute
output = self.handle(*args, **options)
File "C:\Program Files\Python\lib\site-packages\django\core\management\command
s\runserver.py", line 83, in handle
self.run(*args, **options)
File "C:\Program Files\Python\lib\site-packages\django\core\management\command
s\runserver.py", line 92, in run
autoreload.main(self.inner_run, args, options)
File "C:\Program Files\Python\lib\site-packages\django\utils\autoreload.py", l
ine …Run Code Online (Sandbox Code Playgroud)