我正在尝试创建一个简单的表,我在其中插入字段,并在MySql中进行一些检查。我使用Microsoft SQL比较容易。相反,MySql提供evrrytime查询错误,甚至没有指定发生了什么。可怜的MySql软件设计不同,这是我正在尝试做的事情:
1个包含4个字段的表,其中包含一个自动增量自动生成的数字,用于将ID作为主键分配
CREATE TABLE `my_db`.`Patients_table` (
`ID_Patient` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Patient_name` VARCHAR( 200 ) NOT NULL ,
`Recovery_Date` DATETIME NOT NULL ,
`Recovery_count` INT NOT NULL
) ENGINE = MYISAM
插入此类字段的简单存储过程,并在插入之前检查是否存在某些内容:
CREATE PROCEDURE nameInsert(IN nome, IN data)
INSERT INTO Patients_table (Patient_name,Recovery_Date) values (nome,data)
IF (EXISTS (SELECT Recovery_count FROM Tabella_nomi) = 0) THEN
INSERT INTO (Patients_table (Recovery_count)
ELSE
SET Recovery_count = select Recovery_count+1 from Patients_table
END
这在许多层面上似乎都是错误的,MySQL无用的语法检查器也无济于事。
我该怎么做?感谢。
答案 0 :(得分:1)
这段代码似乎有很多问题。 (没有违法行为!)
首先,程序需要包含BEGIN
和END
:
CREATE PROCEDURE nameInsert(IN nome, IN data)
BEGIN
...[actually do stuff here]
END
第二次,因为您的表声明所有字段都为NOT NULL
,所以必须插入所有带INSERT
语句的字段(包括Recovery_Date
列,并排除AUTO_INCREMENT
列。如果您希望自动设置日期列,可以将DEFAULT CURRENT_TIMESTAMP
添加到日期列中。
INSERT INTO Patients_table (Patient_name,Recovery_Date) values (nome,data)
第三次,您的IF
谓词究竟在做什么?
EXISTS (SELECT Recovery_count FROM Tabella_nomi) = 0
如果要检查是否存在行,请不要将= 0
放在最后。此外,Tabella_nomi
未在该过程中的任何位置声明。 同样,您的SELECT
语句应该有一个WHERE
子句,因为我假设您要选择一个特定的行(这将选择所有 recovery_counts)。
第四,第二个INSERT
声明似乎有些混乱。它应该看起来更像第一个INSERT
,并牢记我在上面提出的观点。
INSERT INTO (Patients_table (Recovery_count)
第五,ELSE
声明
SET Recovery_count = select Recovery_count+1 from Patients_table
也有一些问题。 SET
用于设置变量,而不是行中的值。我不是100%确定你的意图来自这个语句,但看起来你打算增加某一行的Recovery_count
列,如果它已经存在的话。在这种情况下,你打算做这样的事情:
UPDATE Patients_table SET Recovery_count = Recovery_count+1 WHERE <conditional predicate>
条件谓词是这样的:
Patients_name = nome
尝试这些内容,并查看尝试执行CREATE STATEMENT
时给出的错误。我敢打赌,他们比你想象的更有用!