【问题标题】:MySql Basic table creation/handingMySql Basic 表创建/处理
【发布时间】:2013-10-26 03:22:56
【问题描述】:

我正在尝试创建一个简单的表,在其中插入字段并在 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 无用的语法检查器也无济于事。

我该怎么做?谢谢。

【问题讨论】:

  • 我认为您至少应该阅读 MySQL Create ProcedureInsert 语句的基础知识。不要责怪你甚至没有试图理解的事情。

标签: mysql sql sql-server


【解决方案1】:

这段代码似乎有很多问题。 (无意冒犯!)


首先,程序需要用BEGINEND包裹:

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 子句,因为我假设你想选择一个特定的行(这将选择一个结果集all em> 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时它给你的错误。我敢打赌它们比你想象的更有用!

【讨论】:

  • 您好,感谢您的回答,别担心,完全没有冒犯。我正在学习 SQL 和 MySQL,弄得一团糟是很正常的。恢复计数它只是一个计数器,每次患者接受治疗时我都会用 MAX(Recovery_count)+1 递增(这只是一个例子,不是真实情况,整个场景都是虚构的)。一一回复你的观点。第一:是的,我复制了错误版本的代码。实际代码有一个 BEGIN 和 END。第二:OK 第三:恢复计数它是一个计数器。它每次都会增加,所以我首先检查它是否存在
  • 我设置为1。第三:
  • 第四:好的第五:是的,我的错。 UPDATE 是我在以前存在的 Recovery_count 的情况下需要的。我会尝试这些建议并告诉你
猜你喜欢
  • 2020-05-15
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多