我有一个属性A,因此有一个与A:
相关的表ID Name OtherFields isPrimary
1 foo stuff 1
2 bar stuff 0
3 blah stuff 0
4 blahh stuff 0
isPrimary列将行标记为主要行。只有一行可以是主行,并且必须始终将行设置为主
在数据库级别强制执行此操作的最佳方法是什么?
最好的方法是创建一个名为Primary的新表,它有一列,ID是引用A.ID的外键吗?
或者,使用上面列出的表结构,我知道我们可以使用唯一索引强制执行不超过一行设置为1,但是我不确定如何强制执行必须设置不少于一行1
我正在使用MS SQL Server
答案 0 :(得分:0)
您可以使用“检查”
public class TrayNotification {
public static void execute(String firstName, String incidentNumber, String requestId, TableView tabTable) throws AWTException, MalformedURLException {
if (SystemTray.isSupported()) {
TrayNotification trayNotification = new TrayNotification();
trayNotification.displayTray(firstName, incidentNumber, requestId, tabTable);
}
}
private void displayTray(String firstName, String incidentNumber, String requestId, TableView tabTable) throws AWTException, MalformedURLException {
// Obtain a single instance of SystemTray
SystemTray tray = SystemTray.getSystemTray();
// Set TrayIcon values
Image image = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/images/tray-icon.png"));
final TrayIcon trayIcon = new TrayIcon(image, "Remedy React Notification");
trayIcon.setImageAutoSize(true);
trayIcon.setToolTip(incidentNumber);
// Add TrayIcon to SystemTray instance if possible
try {
tray.add(trayIcon);
} catch (AWTException e) {
// System.out.println("Notification could not be added.");
}
trayIcon.addActionListener(e -> {
Parent root = null;
try {
root = FXMLLoader.load(getClass().getResource("/fxml/scene.fxml"));
root.requestLayout();
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println("Test");
});
// Display TrayIcon
trayIcon.displayMessage("Hey, " + firstName, "You are now tracking " + incidentNumber + " !", TrayIcon.MessageType.INFO);
}
}
和IsValid()之类的......
CHECK (IsValid(isPrimary) = 'True')
因此,在所有行的IsPrimary为0之前,它不能插入IsPrimary为0的新行。
答案 1 :(得分:0)
我会创建一个新表。我建议你不要把它称为PRIMARY,因为这是一个保留字。您还应该包含约束以确保它不会有多行。例如:
CREATE TABLE prm
(id INTEGER NOT NULL REFERENCES TableA (id),
IsPrimary BIT NOT NULL
DEFAULT (1)
CHECK (IsPrimary=1) UNIQUE);